La construcción de jar ejecutable con maven?
-
06-07-2019 - |
Pregunta
Estoy tratando de generar un jar ejecutable para un hogar pequeño proyecto llamado "logmanager" el uso de maven, tal como esto:
¿Cómo puedo crear un JAR ejecutable con las dependencias de uso de Maven?
He añadido el fragmento que se muestra allí a la pom.xml y corrió mvn de la asamblea:la asamblea.Genera dos archivos jar en logmanager/destino:logmanager-0.1.0.jar y logmanager-0.1.0-jar-with-dependencies.jar.Me sale un error cuando hago doble click en el primer tarro:
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
Un poco diferente de error cuando hago doble clic en el jar-with-dependencies.jar:
Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
He copiado y pegado la ruta de acceso y el nombre de la clase, y se comprueba la ortografía en el POM.Mi clase principal de la lanza multa de un eclipse de configuración de inicio.Alguien me puede ayudar a averiguar por qué mi archivo jar no se ejecutan?También, ¿por qué hay dos frascos para empezar?Déjeme saber si usted necesita más información.
Aquí es el completo pom.xml
, para que sirva de referencia:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gorkwobble</groupId>
<artifactId>logmanager</artifactId>
<name>LogManager</name>
<version>0.1.0</version>
<description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<!-- nothing here -->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
<!-- Quartz scheduler -->
<dependency>
<groupId>opensymphony</groupId>
<artifactId>quartz</artifactId>
<version>1.6.3</version>
</dependency>
<!-- Quartz 1.6.0 depends on commons collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<!-- Quartz 1.6.0 depends on commons logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
<!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
<scope>runtime</scope>
</dependency>
<!-- junitx test assertions -->
<dependency>
<groupId>junit-addons</groupId>
<artifactId>junit-addons</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
<!-- junit dependency; FIXME: make this a separate POM -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1</version>
</dependency>
</dependencies>
<dependencyManagement>
</dependencyManagement>
</project>
Solución
En realidad, creo que la respuesta dada en el pregunta usted ha mencionado es sólo mal (ACTUALIZACIÓN - 20101106: alguien se fija, este la respuesta se refiere a la la versión anterior a la edición) y esto explica, al menos parcialmente, por qué estás en problemas.
Genera dos archivos jar en logmanager/destino:logmanager-0.1.0.jar y logmanager-0.1.0-jar-with-dependencies.jar.
El primero es el TARRO de la logmanager módulo generados durante el package
fase de jar:jar
(debido a que el módulo tiene un envase de tipo jar
).La segunda es la asamblea generado por assembly:assembly
y debe contener las clases del módulo actual y sus dependencias (si utiliza el descriptor de jar-with-dependencies
).
Me sale un error cuando hago doble click en el primer tarro:
Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.
Si se aplica la propuesta de configuración del enlace publicado como referencia, configura el frasco plugin para producir un ejecutable artefacto, algo como esto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Así logmanager-0.1.0.jar
es, de hecho, ejecutable, sino 1.esto no es lo que usted quiere (porque no tiene todas las dependencias) y 2.no contiene com.gorkwobble.logmanager.LogManager
(esto es lo que el error es decir, comprobar el contenido de la jarra).
Un poco diferente de error cuando hago doble clic en el jar-with-dependencies.jar:
Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
De nuevo, si se ha configurado la asamblea plugin como se ha sugerido, tienes algo como esto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
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 contienen un Main-Class
entrada (su probabilidad no es el mismo MANIFIESTO.MF como en logmanager-0.1.0.jar).El frasco es en realidad no ejecutable, que de nuevo no es lo que usted desea.
Por lo tanto, mi sugerencia sería la de eliminar la configuration
elemento de la maven-jar-plugin y configurar maven-asamblea-plugin como este:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<!-- nothing here -->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sample.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Por supuesto, sustituir org.sample.App
con la clase que usted quiere que se han ejecutado.Bono poco, he enlazado assembly:single
a la package
fase, así que usted no tiene que correr assembly:assembly
ya.Sólo tiene que ejecutar mvn install
y la asamblea producidos durante la construcción estándar.
Así que, por favor, actualice su pom.xml con la configuración dada anteriormente y ejecutar mvn clean install
.Entonces, el cd en la target
directorio y vuelve a intentarlo:
java -jar logmanager-0.1.0-jar-with-dependencies.jar
Si recibe un error, por favor, actualice su cuestión y publicar el contenido de la META-INF/MANIFEST.MF
archivo y la parte pertinente de su pom.xml
(los plugins de configuración de partes).También por favor publicar el resultado de:
java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager
para demostrar que está funcionando bien en la línea de comandos (independientemente de lo que eclipse está diciendo).
EDITAR:Para Java 6, usted necesita para configurar maven-compilador-plugin.Agregue esto a su pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Otros consejos
La respuesta de Pascal Thivent también me ayudó.
Pero si administra sus complementos dentro del elemento <pluginManagement>
, debe definir el ensamblaje nuevamente fuera de la administración de complementos, de lo contrario, las dependencias no se empaquetarán en el jar si ejecuta mvn install
.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>main.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins> <!-- did NOT work without this -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<!-- dependencies commented out to shorten example -->
</dependencies>
</project>
Si no desea ejecutar el objetivo de ensamblaje en el paquete, puede usar el siguiente comando:
mvn package assembly:single
Aquí paquete es palabra clave.
Haz clic derecho en el proyecto y da a maven build, maven clean, maven generate resource e maven install. El archivo jar se generará automáticamente.