Soy relativamente nuevo en el mantra de Maven, pero estoy tratando de construir un jar ejecutable en la línea de comandos con Maven. He configurado mis dependencias, pero cuando ejecuto mvn install
e intento ejecutar el jar, suceden dos cosas. Primero, no se encuentra ninguna clase principal, que se pueda corregir. Cuando lo he corregido, obtengo errores al ejecutar que indican que no se pueden encontrar las clases.
Maven no está empaquetando mis bibliotecas de dependencia dentro del jar, por lo que no puedo ejecutar el jar como una aplicación independiente. ¿Cómo corrijo esto?
java
maven-2
build-process
executable-jar
Stefan Kendall
fuente
fuente
Respuestas:
La forma más sencilla de hacer esto sería crear un ensamblado usando
maven-assembly-plugin
y eljar-with-dependencies
descriptor predefinido . También necesitará generar un manifiesto con una entrada de clase principal para este uber jar. El siguiente fragmento muestra cómo configurar el complemento de ensamblaje para hacerlo:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
Luego, para generar el ensamblado, simplemente ejecute:
mvn assembly:assembly
Si desea generar el ensamblaje como parte de su compilación, simplemente vincule el
assembly:single
mojo a la fase del paquete:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Y simplemente ejecuta:
mvn package
fuente
assembly:assembly
objetivo está obsoletoMaven no empaqueta sus dependencias dentro de su archivo jar, porque normalmente no hace esto con programas Java.
En su lugar, entrega las dependencias junto con su archivo jar y las menciona en el
Class-Path
encabezado del Manifiesto .Para seguir esta ruta, deberá habilitar la
addClasspath
propiedad (documentada aquí ) paramaven-jar-plugin
.Si realmente desea incluir todas sus dependencias en su archivo jar, puede usar el complemento Maven Assembly para crear un
jar-with-dependencies
.fuente
Esto es lo que haría yo para proyectos pequeños. La mayoría de las veces no querrás un frasco enorme.
para construir: mvn clean dependency: paquete copy-dependencies
para ejecutar ( en el directorio de destino ): java -cp myjar.jar: ./ dependency / * com.something.MyClass
fuente
Estoy de acuerdo con Joachim Sauer,
En lugar de usar jar-with-dependency, debe configurar el complemento jar así en su pom.xml:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> <mainClass>[mainClassFullName]</mainClass> </manifest> <manifestEntries> <mode>development</mode> <url>${project.url}</url> <key>value</key> </manifestEntries> </archive> </configuration> </plugin>
Y use esta configuración de ensamblaje para agregar las dependencias de jar a su ensamblaje:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>zip-with-jars</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>false</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> </dependencySets> </assembly>
fuente
Simplemente agregue el siguiente código en pom.xml y ejecútelo como: maven: install. El jar se creará en la carpeta de destino de eclipse que se puede utilizar como "java -jar Hello.jar". pero asegúrese de que el nombre de la clase principal sea com.abc.HelloWorld.java
<build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-shade-plugin</artifactid> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalname>HelloW</finalname> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestentries> <main-class>com.abc.HelloWorld.java</main-class> <build-number>1</build-number> </manifestentries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
fuente