22 Stimmen

Maven - Abhängige Bibliotheken in jar ohne Entpacken von Abhängigkeiten einschließen?

Wir versuchen, ein Kundengefäß zu erstellen, das Folgendes umfasst ausgepackt abhängigen Gläsern. Und das Manifest sollte enthalten class-path Einträge zu den abhängigen Gläsern. Das folgende Snippet funktioniert, aber die Jars werden entpackt - wie können wir verhindern, dass die Jars entpackt werden?

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

22voto

Pascal Thivent Punkte 548176

In der Tat ist die Montage mit jar-with-dependencies veranlasst Maven, alle Abhängigkeiten zu entpacken als ${assembly.dependencySets.dependency.unpack} wird eingestellt auf true im entsprechenden Assembly-Deskriptor.

Eine einfache Lösung wäre die Bereitstellung eines Assembly Deskriptors ähnlich dem jar-with-dependencies.xml und ändern ${assembly.dependencySets.dependency.unpack} a false etwa so:

EDITAR: Aus einem unbekannten Grund ist das Verhalten bei der Verwendung von <unpack>false</unpack> ist nicht genau dasselbe und es scheint notwendig, Folgendes hinzuzufügen <outputDirectory>/</outputDirectory> zum fileSet hinzufügen, sonst erhalten Sie 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>

7voto

dur Punkte 14301

Sie können Ihre Abhängigkeiten als jar-Dateien zu Ihrem jar hinzufügen:

montage-deskriptor.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 Kopfzeile in manifest.mf siehe Hinzufügen von Klassen zum Klassenpfad der JAR-Datei :

Anmerkung: Die Class-Path Header verweist auf Klassen oder JAR-Dateien im lokalen Netzwerk, nicht auf JAR-Dateien innerhalb der JAR-Datei oder auf Klassen, die über Internet-Protokolle zugänglich sind. Um Klassen in JAR-Dateien innerhalb einer JAR-Datei in den Klassenpfad zu laden, müssen Sie benutzerdefinierten Code schreiben, um diese Klassen zu laden. Zum Beispiel, wenn MyJar.jar enthält eine weitere JAR-Datei namens MyUtils.jar können Sie die Funktion Class-Path Kopfzeile in MyJar.jar's Manifest zum Laden von Klassen in MyUtils.jar in den Klassenpfad einfügen.

3voto

jopasserat Punkte 5524

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 sich meist in src/assemble befindet. Auf diese Weise wird sie dann anstelle der vordefinierten 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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X