maven 2 - shade - Maven: ¿Dependencias de empaque junto al proyecto JAR?
maven-dependency-plugin (3)
Me gusta Maven para empaquetar un proyecto con dependencias en tiempo de ejecución.
Esta parte no está clara (no es exactamente lo que describe justo después). Mi respuesta cubre lo que describiste.
Espero que cree un archivo JAR con el siguiente manifiesto (...)
Configure el Plugin Maven Jar para hacerlo (o más precisamente, el Archivador Maven ):
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.acme.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
...
<dependencies>
<dependency>
<groupId>dependency1</groupId>
<artifactId>dependency1</artifactId>
<version>X.Y</version>
</dependency>
<dependency>
<groupId>dependency2</groupId>
<artifactId>dependency2</artifactId>
<version>W.Z</version>
</dependency>
</dependencies>
...
</project>
Y esto producirá un MANIFEST.MF con las siguientes entradas:
...
Main-Class: fully.qualified.MainClass
Class-Path: lib/dependency1-X.Y.jar lib/dependency2-W.Z.jar
...
y crea la siguiente estructura de directorios (...)
Esto es factible utilizando el complemento de dependencia de Maven y el objetivo de dependency:copy-dependencies
. De la documentación:
dependency:copy-dependencies
toman la lista de dependencias directas del proyecto y, opcionalmente, dependencias transitivas y las copian en una ubicación específica, eliminando la versión si se desea. Este objetivo también se puede ejecutar desde la línea de comandos.
Podrías atarlo en la fase de package
:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
Me gustaría que Maven empaquetara un proyecto junto con sus dependencias en tiempo de ejecución. Espero que cree un archivo JAR con el siguiente manifiesto:
.....
Main-Class : com.acme.MainClass
Class-Path : lib/dependency1.jar lib/dependency2.jar
.....
y crea la siguiente estructura de directorios:
target
|-- ....
|-- my-project.jar
|-- lib
|-- dependency1.jar
|-- dependency2.jar
Es decir, quiero que el JAR principal excluya las dependencias y quiero que todas las dependencias transitivas se copien en un subdirectorio "lib". ¿Algunas ideas?
Agregue los siguientes complementos en pom.xml. Compruebe el valor en mainClass, classpathPrefix, addClasspath tags.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>org.apache.camel.spring.Main</mainClass>
<classpathPrefix>lib/</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/assembly/some-assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Cree some-assembly.xml bajo src / assembly como se muestra a continuación.
<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>distribution</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<scope>runtime</scope>
<outputDirectory>/lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
Tenga en cuenta que useProjectArtifact flag to false, desempaquete flag to false. Si no se requiere la carpeta raíz dentro del archivo zip, entonces uno puede hacer que includeBaseDirectory sea falso.
Esto creará el archivo name-version-distribution.zip. Dentro del archivo zip, habrá una carpeta con nombre-versión. Dentro de esta carpeta, su archivo ejecutable y su carpeta lib que contienen todos los archivos dependientes estarán presentes. Compruebe el archivo manifest.MF del jar ejecutable. Contiene información de clase principal y classpath.
Puede usar el plugin maven jar, eche un vistazo en esta página: http://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html