maven 2 - pom - Maven-¿Incluir libs dependientes en el tarro sin desempaquetar dependencias?
maven repository (3)
De hecho, el ensamblaje utilizando jar-with-dependencies
hace que maven descomprima todas las dependencias ya que ${assembly.dependencySets.dependency.unpack}
se establece en true
en el descriptor de ensamblaje correspondiente.
Una solución simple sería proporcionar un descriptor de ensamblaje similar al jar-with-dependencies.xml
y modificar ${assembly.dependencySets.dependency.unpack}
a false
, como esto:
EDITAR: por una razón desconocida, el comportamiento cuando se usa <unpack>false</unpack>
no es exactamente el mismo y parece necesario agregar <outputDirectory>/</outputDirectory>
al conjunto de archivos o no se obtiene el resultado esperado .
<assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Estamos tratando de construir un archivo de cliente que incluya archivos dependientes desempaquetados . Y el manifiesto debe tener entradas de class-path
a los archivos jar dependientes. El fragmento de código a continuación funciona, pero los frascos están desempaquetados. ¿Cómo podemos evitar que se desempaqueten los frascos?
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
La solución propuesta por Pascal Thivent define un nuevo ensamblaje para el complemento de ensamblaje de Maven. El complemento de ensamblaje de Maven ofrece ensamblajes predeterminados que son ''bin'', ''jar-with-dependencies'', ''project'' y ''src'' produciendo varios paquetes predefinidos.
Se debe definir un nuevo ensamblaje en un nuevo archivo xml, la mayoría del tiempo ubicado en src / assemble. Luego se cargará en lugar del predefinido, de esta manera:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<!-- disabled predefined assembly -->
<!--
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
-->
<descriptors>
<descriptor>src/assemble/myAssembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
Puedes agregar tus dependencias como archivos jar a tu jar:
ensamblador-descriptor.xml
<assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>.</outputDirectory>
</fileSet>
</fileSets>
</assembly>
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-uberjar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptor>src/main/assemble/assembly-descriptor.xml</descriptor>
</configuration>
</execution>
</executions>
</plugin>
Pero, desafortunadamente, no puede usar el encabezado Class-Path
en manifest.mf
, consulte Agregar clases a Classpath del archivo JAR :
Nota: El encabezado
Class-Path
apunta a clases o archivos JAR en la red local, no a archivos JAR dentro del archivo JAR o clases accesibles a través de protocolos de Internet. Para cargar clases en archivos JAR dentro de un archivo JAR en la ruta de clases, debe escribir código personalizado para cargar esas clases. Por ejemplo, siMyJar.jar
contiene otro archivo JAR llamadoMyUtils.jar
, no puede usar el encabezadoClass-Path
enMyJar.jar''s
manifiestoMyJar.jar''s
para cargar clases enMyUtils.jar
en la ruta de clases.