¿Construir un bote ejecutable con maven?

Intento generar un jar ejecutable para un pequeño proyecto doméstico llamado “logmanager” usando maven, como este:

¿Cómo puedo crear un JAR ejecutable con dependencias usando Maven?

Agregué el fragmento que se muestra allí al pom.xml y ejecuté mvn assembly: assembly. Genera dos archivos jar en logmanager / target: logmanager-0.1.0.jar y logmanager-0.1.0-jar-with-dependencies.jar. Aparece un error cuando hago doble clic en el primer jar:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Un error ligeramente diferente cuando hago doble clic en jar-with-dependencies.jar:

 Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

Copié y pegué la ruta y el nombre de clase, y verifiqué la ortografía en el POM. Mi clase principal inicia bien desde una configuración de lanzamiento de eclipse. ¿Alguien me puede ayudar a descubrir por qué mi archivo jar no se ejecutará? Además, ¿por qué hay dos jarrones para comenzar? Déjeme saber si usted necesita más información.

Aquí está el pom.xml completo, para referencia:

  4.0.0 com.gorkwobble logmanager LogManager 0.1.0 Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.    org.apache.maven.plugins maven-jar-plugin 2.2    org.apache.maven.plugins maven-assembly-plugin 2.2-beta-4   jar-with-dependencies    com.gorkwobble.logmanager.LogManager      package  single      org.apache.maven.plugins maven-compiler-plugin  1.6 1.6        commons-lang commons-lang 2.4    opensymphony quartz 1.6.3    commons-collections commons-collections 3.1    commons-logging commons-logging 1.1    javax.transaction jta 1.1 runtime    junit-addons junit-addons 1.4 test    junit junit 4.1      

En realidad, creo que la respuesta dada en la pregunta que mencionaste es incorrecta ( ACTUALIZACIÓN – 20101106: alguien la solucionó, esta respuesta se refiere a la versión anterior a la edición ) y esto explica, al menos parcialmente, por qué te encuentras con problemas.


Genera dos archivos jar en logmanager / target: logmanager-0.1.0.jar y logmanager-0.1.0-jar-with-dependencies.jar.

El primero es el JAR del módulo logmanager generado durante la fase del package por jar:jar (porque el módulo tiene un paquete de tipo jar ). El segundo es el ensamblado generado por assembly:assembly y debe contener las clases del módulo actual y sus dependencias (si usó el descriptor jar-with-dependencies ).

Aparece un error cuando hago doble clic en el primer jar:

 Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Si aplicó la configuración sugerida del enlace publicado como referencia, configuró el complemento jar para producir un artefacto ejecutable, algo como esto:

   org.apache.maven.plugins maven-jar-plugin    true com.gorkwobble.logmanager.LogManager     

Entonces logmanager-0.1.0.jar es efectivamente ejecutable pero 1. esto no es lo que quiere (porque no tiene todas las dependencias) y 2. no contiene com.gorkwobble.logmanager.LogManager (esto es lo que el error es decir, verificar el contenido del contenedor).

Un error ligeramente diferente cuando hago doble clic en jar-with-dependencies.jar:

 Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

Nuevamente, si configuró el plugin de ensamblaje como se sugiere, tiene algo como esto:

   org.apache.maven.plugins maven-assembly-plugin   jar-with-dependencies    

Con esta configuración, logmanager-0.1.0-jar-with-dependencies.jar contiene las clases del módulo actual y sus dependencias pero, según el error, su META-INF/MANIFEST.MF no contiene una Main-Class entrada (probablemente no es el mismo MANIFEST.MF que en logmanager-0.1.0.jar). El contenedor en realidad no es ejecutable, lo que nuevamente no es lo que quieres.


Por lo tanto, mi sugerencia sería eliminar el elemento de configuration del maven-jar-plugin y configurar el complemento maven-assembly de esta manera:

   org.apache.maven.plugins maven-jar-plugin 2.2    org.apache.maven.plugins maven-assembly-plugin 2.2-beta-4   jar-with-dependencies    org.sample.App      package  single     

Por supuesto, reemplace org.sample.App con la clase que desea ejecutar. Poco extra, he unido el assembly:single a la fase del package para que no tenga que ejecutar el assembly:assembly más. Simplemente ejecute mvn install y el ensamblado se producirá durante la comstackción estándar.

Por lo tanto, actualice su pom.xml con la configuración indicada anteriormente y ejecute mvn clean install . Luego, cd en el directorio de target e intente de nuevo:

 java -jar logmanager-0.1.0-jar-with-dependencies.jar 

Si obtiene un error, actualice su pregunta con él y publique el contenido del archivo META-INF/MANIFEST.MF y la parte relevante de su pom.xml (las partes de configuración de complementos). También publique el resultado de:

 java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager 

para demostrar que funciona bien en la línea de comandos (independientemente de lo que esté diciendo eclipse).

EDITAR: para Java 6, necesita configurar el comstackdor maven-compiler. Agregue esto a su pom.xml:

   org.apache.maven.plugins maven-compiler-plugin  1.6 1.6   

La respuesta de Pascal Thivent también me ayudó. Pero si administra sus complementos dentro del elemento , debe definir el ensamblaje nuevamente fuera de la administración del complemento, o de lo contrario las dependencias no se empaquetarán en el mvn install si ejecuta mvn install .

  4.0.0 1.0.0-SNAPSHOT jar     org.apache.maven.plugins maven-compiler-plugin 3.1  1.6 1.6    org.apache.maven.plugins maven-assembly-plugin 2.4    main.App    jar-with-dependencies     make-assembly package  single          org.apache.maven.plugins maven-assembly-plugin        

Si no desea ejecutar el objective de ensamblaje en el paquete, puede usar el siguiente comando:

 mvn package assembly:single 

Aquí el paquete es palabra clave.

Haz clic derecho en el proyecto y dale a maven build, maven clean, maven generate resource y maven install. El archivo jar se generará automáticamente.