2009-11-18 20 views
18

Estamos tratando de crear un contenedor de cliente que incluya desempaquetado jar dependiente. Y el manifiesto debe tener class-path entradas a los jars dependientes. El siguiente fragmento funciona, pero los frascos están desempacados: ¿cómo podemos evitar que los frascos se desempaqueten?Maven - ¿Incluye libs dependientes en el contenedor sin desempaquetar dependencias?

 <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> 

Respuesta

18

De hecho, el montaje utilizando jar-with-dependencies causas experto para desempaquetar todas las dependencias como ${assembly.dependencySets.dependency.unpack} se establece en true en el descriptor de montaje correspondiente.

Una solución sencilla sería la de proporcionar un descriptor de montaje similar al jar-with-dependencies.xml y modificar ${assembly.dependencySets.dependency.unpack} a false, así:

EDIT: Por una razón desconocida, el comportamiento cuando se utiliza <unpack>false</unpack> no es exactamente la misma y parece necesario agregar <outputDirectory>/</outputDirectory> al fileSet o no 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> 
+1

También agregaría ' falso'. – yegor256

3

La solución propuesta por Pascal Thivent define un nuevo ensamblaje para el complemento de ensamblaje Maven. El complemento Maven assembly ofrece conjuntos predeterminados que son 'bin', 'jar-with-dependencies', 'project' y 'src' que producen varios paquetes predefinidos.

Se debe definir un nuevo conjunto en un nuevo archivo xml, la mayoría del tiempo ubicado en src/assemble. A continuación, se cargará en lugar de la predefinida, 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> 
3

Puede añadir sus dependencias como archivos jar a su frasco:

montaje 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, por desgracia no se puede utilizar la cabecera Class-Path en manifest.mf, ver Adding Classes to the JAR File's Classpath:

Nota: LosClass-Path puntos de cabecera a clases o archivos JAR en la red local, no los 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 la clase, debe escribir código personalizado para cargar esas clases. Por ejemplo, si MyJar.jar contiene otro archivo JAR llamado MyUtils.jar, no puede usar el encabezado Class-Path en el manifiesto MyJar.jar's para cargar las clases en MyUtils.jar en la ruta de la clase.

Cuestiones relacionadas