2009-11-18 27 views
18

Stiamo cercando di costruire un barattolo client che include imballati dipendente vaso di. E il manifest dovrebbe avere le voci class-path nei giare dipendenti. Lo snippet qui sotto funziona ma i vasi sono spacchettati: come possiamo impedire che i vasi vengano decompressi?Maven - Include libs dipendenti in jar senza decomprimere le dipendenze?

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

risposta

18

Infatti, assemblaggio utilizzando jar-with-dependencies cause Maven per decomprimere tutte le dipendenze come ${assembly.dependencySets.dependency.unpack} è impostato true del corrispondente descrittore di assemblaggio.

una semplice correzione sarebbe quello di fornire un descrittore di assemblaggio simile al jar-with-dependencies.xml e modificare ${assembly.dependencySets.dependency.unpack}-false, in questo modo:

EDIT: per un motivo sconosciuto, il comportamento quando si utilizza <unpack>false</unpack> non è esattamente la stessa cosa e sembra necessario aggiungere <outputDirectory>/</outputDirectory> al set di file o non si ottiene il risultato atteso.

<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

Vorrei anche aggiungere ' false'. – yegor256

3

La soluzione proposta da Pascal Thivent definisce un nuovo assieme per il plug-in di assembly Maven. Il plugin Maven complesso offre default assiemi che sono 'bin', 'jar-con-dipendenze', 'progetto' e 'src' produrre vari fasci predefiniti.

Un nuovo complessivo deve essere definita in un nuovo file XML, il più delle volte si trova in src/montare. Poi sarà caricata al posto di quello predefinito, in questo modo:

<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

È possibile aggiungere le dipendenze come file jar al vostro vaso:

catena di montaggio 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> 

Ma purtroppo non è possibile utilizzare l'intestazione Class-Path in manifest.mf, vedere Adding Classes to the JAR File's Classpath:

Nota: IClass-Path punti di intestazione per classi o file JAR sulla rete locale, non file JAR all'interno del file JAR o classi accessibili tramite i protocolli Internet. Per caricare le classi nei file JAR all'interno di un file JAR nel percorso della classe, è necessario scrivere codice personalizzato per caricare tali classi. Per esempio, se MyJar.jar contiene un altro file JAR chiamato MyUtils.jar, non è possibile utilizzare l'intestazione Class-Path in MyJar.jar's manifesta per caricare classi MyUtils.jar nel percorso di classe.

Problemi correlati