2009-11-18 6 views
18

Wir versuchen, ein Client-Jar zu erstellen, das entpackte abhängige Jars enthält. Und das Manifest sollte Einträge zu den abhängigen Gläsern haben. Der folgende Ausschnitt funktioniert, aber die Gläser sind ausgepackt - wie können wir verhindern, dass die Gläser ausgepackt werden?Maven - Abhängige Bibliotheken in jar einschließen, ohne Abhängigkeiten zu entpacken?

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

Antwort

18

Tatsächlich Zusammenbauen jar-with-dependencies Ursachen maven verwenden alle Abhängigkeiten zu entpacken als ${assembly.dependencySets.dependency.unpack} zu true in der entsprechenden Montage Deskriptors gesetzt ist.

Eine einfache Lösung wäre eine Assembly Descriptor jar-with-dependencies.xml auf die ähnlich zu bieten und ${assembly.dependencySets.dependency.unpack}-false, wie dies zu ändern:

EDIT: aus einem unbekannten Grund, das Verhalten, wenn <unpack>false</unpack> ist nicht genau das gleiche mit und es scheint notwendig, <outputDirectory>/</outputDirectory> zum fileSet hinzuzufügen, oder Sie erhalten nicht das erwartete Ergebnis.

<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

Ich würde auch ' false' hinzufügen. – yegor256

3

Die von Pascal Thivent vorgeschlagene Lösung definiert eine neue Assembly für das Maven Assembly Plugin. Das Maven-Assembly-Plugin bietet Standard-Assemblies, die 'bin', 'jar-with-dependencies', 'project' und 'src' sind und verschiedene vordefinierte Bundles erzeugen.

Eine neue Assembly muss in einer neuen XML-Datei definiert werden, die meiste Zeit in src/assemble. Dann wird es anstelle der vordefinierten ein, auf diese Weise geladen:

<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

Sie Ihre Abhängigkeiten als JAR-Dateien zu Ihrem Glas hinzufügen:

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

Aber leider können Sie nicht die Class-Path Header in manifest.mf verwenden, finden Sie Adding Classes to the JAR File's Classpath:

Hinweis: Die Class-Path Kopfpunkte auf Klassen oder JAR-Dateien im lokalen Netzwerk, nicht JAR-Dateien in der JAR-Datei oder Klassen, die über Internetprotokolle zugänglich sind. Um Klassen in JAR-Dateien innerhalb einer JAR-Datei in den Klassenpfad zu laden, müssen Sie benutzerdefinierten Code zum Laden dieser Klassen schreiben. Beispiel: Wenn MyJar.jar eine andere JAR-Datei mit der Bezeichnung MyUtils.jar enthält, können Sie die Class-Path-Kopfzeile in MyJar.jar's manifest nicht verwenden, um Klassen in MyUtils.jar in den Klassenpfad zu laden.

Verwandte Themen