Obtener HASH MD5 de un texto con Java y generar JAR para ejecutar aplicación Java en Windows y Linux

Explicamos cómo obtener el HASH MD5 de un texto con el lenguaje de programación Java. Para ello explicaremos cómo dar de alta un nuevo proyecto Java desde cero, de aplicación de consola (línea de comandos), con el IDE IntelliJ IDEA. Solicitará el texto por consola al usuario y mostrará su MD5, también admitirá que se le pase el texto por parámetro al comando (al fichero JAR). Generaremos el JAR del programa y lo ejecutaremos tanto en Windows como en Linux.

Requisitos para desarrollar aplicación que obtenga el HASH MD5 de un texto en Java

Únicamente necesitaremos un IDE de desarrollo en Java, aunque tampoco es estrictamente necesario. Este IDE nos ayudará a desarrollar la aplicación y a generar el JAR del programa.

En nuestro caso usaremos IntelliJ IDEA 2020.2 8 (Community Edition), versión gratuita, aunque sirve cualquier otro IDE como Eclipse o NetBeans.

Crear proyecto Java de aplicación de consola en IntelliJ IDEA

Crearemos el proyecto Java, para ello abriremos el IDE IntelliJ IDEA y pulsaremos en «New Project» (o bien desde «File» – «New Project»:

Crear proyecto Java de aplicación de consola en IntelliJ IDEA

Seleccionaremos «Java», en la parte derecha veremos que nos muestra la versión del SDK de Java que usaremos para el proyecto, en nuestro caso 11.0.2. Por lo tanto la máquina virtual de Java que usemos para ejecutar la aplicación deberá tener la misma versión o una superior (esto lo explicamos más adelante). Pulsaremos en «Next»:

Crear proyecto Java de aplicación de consola en IntelliJ IDEA

Marcaremos «Create project from template» y elegiremos «Command Line App». Pulsaremos en «Next»:

Crear proyecto Java de aplicación de consola en IntelliJ IDEA

Introduciremos un nombre para el proyecto, por ejemplo «MD5», la carpeta donde se guardará y el nombre para el paquete en «Base package», por ejemplo com.ProyectoA. Pulsaremos en «Finish» para crear el proyecto Java:

Crear proyecto Java de aplicación de consola en IntelliJ IDEA

Código de la aplicación Java que obtiene el HASH MD5 de un texto

Una vez creado el proyecto, procederemos a añadir el código Java, necesario para pedir un texto al usuario por consola y mostrar el HASH MD5 de dicho texto. La aplicación también permitirá que se le pase como parámetro el texto a codificar.

Introduciremos el código Java en la clase Main que se crea por defecto:

Mostramos el código Java completo de la aplicación a continuación:

El código fuente Java puede descargarse en el siguiente enlace:

El código Java anterior está comentado con los pasos más importantes. Básicamente comprueba si se le ha pasado un parámetro al ejecutable, en cuyo caso calcula directamente el HASH MD5 del texto pasado como parámetro y lo muestra por consola. En caso de que no se le haya pasado parámetro pedirá al usuario que introduzca el texto y pulse INTRO, realizando el mismo proceso.

La función ObtenerHASHMD5 será la encargada de obtener el HASH MD5 del texto.

Compilación y prueba de la aplicación Java que obtiene el HASH MD5 de un texto en IntelliJ IDEA

Compilar y ejecutar aplicación Java en IntelliJ IDEA

En primer lugar pulsaremos en el menú «Run» – «Run ‘Main'» para ejecutar la aplicación y comprobar que funciona correctamente:

Compilar y ejecutar aplicación Java en IntelliJ IDEA

Si la compilación es correcta y no tenemos errores de sintaxis, se ejecutará la aplicación. Si no le hemos pasado un parámetro, nos solicitará que introduzcamos el texto. Lo introduciremos y pulsaremos INTRO para que nos calcule el HASH MD5:

Compilar y ejecutar aplicación Java en IntelliJ IDEA

En nuestro ejemplo, para el texto «Esto es una prueba de MD5» obtendrá el MD5: 5163cca4c400557df42e85424615aef0.

Pasar argumentos/parámetros a aplicación Java desde IntelliJ IDEA

Si queremos pasarle el texto como parámetro para verificar que funciona la aplicación, desde IntelliJ, seguiremos los siguientes pasos. Pulsaremos en el menú «Run» – «Edit configurations…» de IntelliJ IDEA:

Pasar argumentos/parámetros a aplicación Java desde IntelliJ IDEA

En «Program arguments» introduciremos el parámetro. En nuestro caso, al ser un texto con espacios, lo introduciremos entre comillas para que Java lo tome como un único parámetro. Si no ponemos las comillas no funcionará de forma correcta porque interpretará cada palabra como un parámetro. Una vez introducido el texto en los argumentos pulsaremos en «OK»:

Pasar argumentos/parámetros a aplicación Java desde IntelliJ IDEA

Ahora ejecutaremos la aplicación y comprobaremos que obtiene el texto a codificar del parámetro que le hemos pasado, por lo tanto no lo pedirá por consola. Se ejeecutará y directamente calculará el HASH y lo mostrará:

Pasar argumentos/parámetros a aplicación Java desde IntelliJ IDEA

Generar fichero JAR empaquetado de aplicación Java con IntelliJ IDEA

Hasta ahora hemos ejecutado la aplicación usando el IDE de desarrollo IntellJ, para depurar errores y comprobar que funciona. Si queremos ejecutar la aplicación en cualquier equipo (con Windows o Linux), como si de un ejecutable se tratase, seguiremos los siguientes pasos.

Generaremos un fichero JAR, que en realidad es un fichero comprimido con los ficheros necesarios de la aplicación:

  • El fichero de manifiesto: MANIFEST.MF
  • El fichero Main.class: el bytecode del fichero Main.java compilado.

En este caso el ejecutable será un .jar, que necesitará el compilador de Java. A continuación explicaremos cómo generar el .jar y cómo ejecutarlo en un equipo con Windows y con Linux.

Para generar el JAR en IntelliJ IDEA, con nuestro proyecto Java abierto, accederemos al menú «File» – «Project Structure…»:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Seleccionaremos «Artifacts» en «Projects Settings» [1] y pulsaremos en «+» [2]:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Pulsaremos en «JAR» y en «From modules with dependencies…»:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

En «Module» nos aparecerá «MD5». En «Main Class» introduciremos el nombre de nuestra clase principal, como estamos usando package, introduciremos en formato: com.ProyectoA.Main, que es como se llama el package de nuestra aplicación (com.ProyectoA) y la clase principal (Main). Si no lo conocemos podemos pulsar en el botón carpeta (Browse) para elegirla:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Seleccionaremos nuestra clase principal (normalmente Main):

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Dejaremos marcada la opción «extract to the target JAR» en «JAR files from libraries». Una vez seleccionada la clase principal, en «Directory for META-INF/MANIFEST.MF» nos pondrá por defecto: …\IdeaProjects\MD5\src. Pulsaremos «OK» para guardar la configuración del JAR:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Nos mostrará la ventana de «Project Structure» con el nuenvo Artifact creado (MD5:jar). Pulsaremos «OK»:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Por último, para generar el fichero JAR, pulsaremos en el menú «Build» – «Build Artifacts»:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

En el menú emergente que se mostrará pulsaremos en «MD5» – «Build»:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Realizará la generación del JAR, con el siguiente resultado:

Executing pre-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Running ‘before’ tasks
Checking sources
Copying resources… [MD5]
Building artifact ‘MD5:jar’…
Deleting outdated files…
Building artifact ‘MD5:jar’: copying files…
Building archives…
Building C:/Users/alonso/IdeaProjects/MD5/out/artifacts/MD5_jar/MD5.jar…
Copying archives…
Running ‘after’ tasks
Finished, saving caches…
Executing post-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Synchronizing output directories…

Si la generación del JAR es correcta nos habrá creado el fichero JAR en la carpeta del proyecto …out\artifacts, en nuestro caso el fichero MD5.jar:

…\IdeaProjects\MD5\out\artifacts\MD5_jar\MD5.jar

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

En realidad, como hemos comentado, el fichero .jar es un fichero comprimido que se puede abrir con cualquier compresor de ZIP y ver su contenido:

Generar fichero JAR empaquetado de  aplicación Java con IntelliJ IDEA

Y como vemos al abrirlo, contiene dos carpetas: META-INF y com. La carpeta META-INF contiene el fichero de manifiesto MANIFEST.MF y la carpeta com contiene el fichero Main.class.

Ejecutar fichero JAR de aplicación Java en Windows

En primer lugar deberemos disponer de una Máquina Virtual Java. Podremos comprobarlo en Aplicaciones y características (para Windows 10), nos aparecerá una aplicación con el nombre Java 8 Update 261 (64-bit) o la versión que corresponda:

Ejecutar fichero JAR de aplicación Java en Windows

También podremos comprobar si tenemos Java y la versión instalada abriendo una ventana de consola, pulsando en el botón Inicio de Windows y escribiendo «cmd». Nos mostrará «Símbolo del sistema». Pulsaremos en «Abrir»:

Ejecutar fichero JAR de aplicación Java en Windows

Escribiremos el comando:

java -version

Si tenemos Java instalado y tenemos la variable de entorno PATH de Windows correctamente configurada, nos mostrará la versión de Java, en nuestro caso «java version 1.8.0_271»:

En caso contrario nos mostrará un error indicando que no ha encontrado el comando:

Ejecutar fichero JAR de aplicación Java en Windows

En caso de no tener la Máquina Virtual Java instalada, accederemos a su web oficial para descargala e instalarla:

Ejecutar fichero JAR de aplicación Java en Windows

Descargaremos el ejecutable «jre-8u271-windows-x64.exe» (para la versión 1.8.0_271 de 64 bits) y lo instalaremos:

Ejecutar fichero JAR de aplicación Java en Windows

Debemos asegurarnos de que en la variable PATH de Windows (Variables de entorno) existe la ruta a la carpeta bin del Java instalado. Para el caso de Windows 10, por defecto se instalará en:

C:\Program Files\Java\jre1.8.0_271\bin

Por lo tanto, en Variables de entorno, en la variable PATH, deberá existir una referencia a esa carpeta. Si no existe la añadiremos, pulsando en el botón inicio de Windows, escribiendo «Variables de entorno»:

Ejecutar fichero JAR de aplicación Java en Windows

Pulsaremos en «Variables de entorno»:

Ejecutar fichero JAR de aplicación Java en Windows

Seleccionaremos la variable «Path» de «Variables del sistema» (para que sirva para todos los usuarios del equipo) pulsaremos en «Editar»:

Ejecutar fichero JAR de aplicación Java en Windows

Pulsaremos en «Nuevo» y añadiremos la ruta completa de la instalación de la Máquina Virtual Java:

Ejecutar fichero JAR de aplicación Java en Windows

De esta forma ya podremos ejecutar el comando java desde la línea de comandos para ejecutar el fichero JAR creado anteriormente.

Probaremos la ejecución del fichero JAR, para ello abriremos una ventana de MS-DOS, como hemos hecho anteriormente para ejecutar java -version y accederemos a la carpeta donde tengamos el fichero JAR de nuestra aplicación, con el comando cd y la ruta, en nuestro caso:

cd C:\Users\alonso\IdeaProjects\MD5\out\artifacts\MD5_jar

Ahora ejecutaremos la aplicación con el comando:

java -jar MD5.jar

Si todo es correcto se ejecutará la aplicación como mostramos a continuación. Si no le pasamos parámetros nos solicitará el texto para calcular el MD5:

Ejecutar fichero JAR de aplicación Java en Windows

Y si le pasamos el texto por parámetro, nos mostrará directamente el HASH MD5:

java -jar MD5.jar «Esto es una prueba»

Ejecutar fichero JAR de aplicación Java en Windows

Ejecutar fichero JAR de aplicación Java en Linux

Para el caso de equipos con Linux también necesitaremos disponer de la máquina virtual Java para Linux. Por lo tanto comprobaremos si está instalado, por ejemplo ejecutando el comando (el mismo que para Windows):

java -version

Si nos devuelve la versión será que está instalada la máquina virtual Java, si nos devuelve error será porque no está instalada:

En nuestro caso usamos una distribución de Linux CentOS 7, el proceso de instalación de la máquina virtual Java puede variar en función de la distribución usada, aunque es similar en todas.

Instalaremos JDK 11, que es la versión que hemos usado en el compilador. Para instarla ejecutaremos el siguiente comando Linux:

yum install java-11-openjdk-devel

Nos pedirá confirmación para instalar, pulsaremos Y e INTRO:

Una vez instalada, volveremos a ejecutar el comando java -version, esta vez tendremos respuesta y nos mostrará la versión de Java instalada, la 11.0.8 LTS (que es igual o superior a la que hemos usado para la compilación en IntelliJ IDEA y para la generación del JAR, la 11.0.2):

Ahora podremos ejecutar nuestra aplicación Java, ejecutando el JAR, como hemos hecho en el caso de Windows. Ejecutaremos el JAR tanto sin parámetros como con parámetros, obteniendo el mismo resultado que en el caso de Windows:

java -jar MD5.jar

Que nos solicitará que introduzcamos el texto a codificar en MD5 y una vez introducido nos devolverá el resultado.

Y el comando:

java -jar MD5.jar «Esto es una prueba»

Que al haberle pasado como parámetro el texto nos devolverá directamente el HASH MD5 resultante:

Vemos que la aplicación Java funciona perfectamente también en Linux, sin haber tenido que recompilar ni hacer nada. Exactamente el mismo JAR funcionará tanto en Windows como en Linux. Esto es debido a que Java es un lenguaje compilado pero a un código intermedio, el bytecode (el fichero .class). Será la máquina virtual Java la encargada de interpretar el bytecode (.class) generado, el contenido en el fichero JAR, según el sistema operativo donde se encuentre. De esta forma se consigue que un mismo «ejecutable» sirva para distintos sistemas operativos.

Descarga del código fuente Java completo del proyecto en IntelliJ IDEA

A continuación os dejamos el enlace para la descarga del código fuente Java completo de esta aplicación (realizado con IntelliJ IDEA 2020.2):

Errores comunes y su posible solución

Error java.lang.UnsupportedClassVersionError, JDK, JRE, JVM, versionado

Un de los errores habituales a la hora de ejecutar los JAR, tanto en Windows como en Linux, es que nos muestre que la versión de la máquina virtual del sistema operativo es inferior a la versión en la que se ha compilado el bytecode. El error suele ser:

Error: A JNI error has occurred, please check you installation and try again
Exception in thread «main» java.lang.UnsupportedClassVersionError: com/ProyectoA/Main has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file version up to 52.0.

Error java.lang.UnsupportedClassVersionError

Como vemos en el error de la imagen anterior, hemos usado para compilar el Main.class de nuestra aplicación (contenido en el MD5.jar), la versión de JDK 11.0.2, equivalente a la versión 55 como podemos ver en la siguiente tabla:

Versión bytecode .classVersión Java
451.1
461.2
471.3
481.4
495
506
517
528
539
5410
5511
5612
5713

Como vemos en la tabla anterior, y como hemos comentado, en nuestro caso hemos compilado la aplicación Java MD5 usando la versión JDK 11.0.2 (55):

Error java.lang.UnsupportedClassVersionError

Mientras que en el equipo (sea Windows o Linux) donde queríamos ejecutar la aplicación hemos instalado JVM 1.8.0_271, que es equivalente a la versión 52:

Error java.lang.UnsupportedClassVersionError

El versionado de Java puede ser bastante lioso, sobre todo si tenemos en cuenta que podemos tener JDK, JRE, JVM:

  • JDK (Java Development Kit), también JSE: es un entorno de desarrollo de software utilizado para desarrollar aplicaciones y applets de Java. Incluye Java Runtime Environment (JRE), un intérprete/cargador (Java), un compilador (javac), un archivador (jar), un generador de documentación (Javadoc) y otras herramientas necesarias para el desarrollo de Java.
  • JRE (Java Runtime Environment): contiene las partes de las bibliotecas Java necesarias para ejecutar programas Java y está destinado a usuarios finales. JRE se puede ver como un subconjunto de JDK.
  • JVM (Java Virtual Machine): es una máquina abstracta. Es una especificación que proporciona un entorno de tiempo de ejecución en el que se puede ejecutar bytecode de Java. Las JVM están disponibles para muchas plataformas de hardware y software.

Además, JDK se puede dividir en:

  • JSE (Java Standard Edition): sirve para desarrollar aplicaciones independientes, aplicaciones de escritorio o incluso escribir scripts utilizando la herramienta Selenium para pruebas de automatización.
  • JEE (Java Enterprise Edition): se utiliza para desarrollar aplicaciones web empresariales enriquecidas.
  • JME (Java Micro Edition): puede usarse para desarrollar aplicaciones que se ejecutan en dispositivos móviles, sistemas integrados, etc..

Y, por supuesto, en un mismo equipo podemos tener varias versiones de cada JVM, JDK y JRE. Para no liarnos mucho y puesto que JDK incluye JRE y JVM, para solucionar este error de versionado, será suficiente con instalar JDK, tanto en Windows como en Linux, en una versión igual o superior a la que hayamos usado en la compilación con IntelliJ IDEA.

A la hora de usar el comando java para ejecutar el JAR, el sistema operativo tomará el que esté en la variable de entorno PATH, tanto en Windows como en Linux.

Error al ejecutar JAR: Could not find or load main class

Cuando intentamos ejecutar el fichero JAR y nos muestra el error:

Error Could not find or load main class
Caused by: java.lang.ClassNotFoundException

Error al ejecutar JAR: Could not find or load main class

El error anterior suele ser debido a que o bien no hemos incluido el fichero MANIFEST.MF en el JAR o bien no se ha introducido la clase principal de la aplicación correctamente en este fichero. Un contenido de ejemplo de un fichero MANIFEST.MF, para el caso de nuestra aplicación:

Manifest-Version: 1.0
Main-Class: com.ProyectoA.Main

Error al ejecutar JAR: Could not find or load main class

Para solucionar este error será suficiente con establecer la clase principal (Main class) de nuestro proyecto Java en el Artifacts, como hemos explicado en este paso anterior:

Error al ejecutar JAR: Could not find or load main class

Error al ejecutar JAR: Could not find or load main class nombre_clase

El mismo error que en el caso anterior, pero en este caso el error incluye el nombre de la clase Main:

Could not find or load main class com.ProyectoA.Main
Caused by: java.lang.ClassNotFoundException: com.ProyectoA.Main

Error al ejecutar JAR: Could not find or load main class nombre_clase

En este caso, el error es similar al anterior, o bien no se ha indicado el nombre de la clase Main correcto en el fichero de manifiesto MANIFEST.MF o bien la carpeta que contiene el (o los) fichero .class de la aplicación no tiene la ruta correcta. Por ejemplo, si nuestra clase Main se llama:

com.ProyectoA.Main

El fichero JAR, si lo descomprimiéramos, deberá contener la estructura de directorios siguiente:

Error al ejecutar JAR: Could not find or load main class nombre_clase

Contendrá, como ya hemos explicado en pasos anteriores, la carpeta com, la subcarpeta ProyectoA y dentro el fichero Main.class. Y por otro lado contendrá la carpeta META-INF y dentro el fichero MANIFEST.MF.

Para solucionar este problema seguiremos los pasos indicados en este punto del artículo.

alonsojpd

alonsojpd

Presidente y fundador de Proyecto A y AjpdSoft

También te podría gustar...

Deja una respuesta