una proyecto para librerias empaquetar ejecutar ejecutable desde cuál create crear consola configuración con archivo app aplicacion java eclipse maven-2 build-process executable-jar

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.