java - proyecto - empaquetar librerias en jar netbeans maven
¿Construir un bote ejecutable con maven? (4)
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:
<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>
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:
<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 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:
<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, 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 compilació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 compilador maven-compiler. 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>
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:
<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>
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.
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 del complemento, o de lo contrario las dependencias no se empaquetarán en el mvn install
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í el paquete es palabra clave.