Ich möchte mein Projekt zur Verteilung in ein einziges ausführbares JAR packen.
Wie kann ich ein Maven-Projekt dazu bringen, alle Abhängigkeits-JARs in meine Ausgabe-JAR zu packen?
soemirno
Ich möchte mein Projekt zur Verteilung in ein einziges ausführbares JAR packen.
Wie kann ich ein Maven-Projekt dazu bringen, alle Abhängigkeits-JARs in meine Ausgabe-JAR zu packen?
Andre Aronsen
Sie können das Abhängigkeits-Plugin verwenden, um alle Abhängigkeiten vor der Paketphase in einem separaten Verzeichnis zu generieren und diese dann in den Klassenpfad des Manifests aufzunehmen:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>theMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Alternativ verwenden ${project.build.directory}/classes/lib
als OutputDirectory verwenden, um alle JAR-Dateien in die Haupt-JAR-Datei zu integrieren, aber dann müssen Sie benutzerdefinierten Classloading-Code hinzufügen, um die JAR-Dateien zu laden.
Gibt es eine Möglichkeit, diese Methode zu verwenden, ohne benutzerdefinierte Klassenlader zu schreiben? Ich erhalte “ClassNotFoundException”. Als ich das Assembly-Plugin verglichen habe, dachte ich, dass ich die Abhängigkeiten mit maven-dependency-plugin entpacken könnte. Irgendwelche Empfehlungen?
– gbaum
13. Dezember 2021 um 14:53 Uhr
Dies ist immer noch äußerst hilfreich
– Benutzer1238097
24. August um 0:09 Uhr
Gibt es eine Möglichkeit, in der Paketphase Batch- und Bash-Skript zum endgültigen Zip hinzuzufügen, damit das Skript java -jar
– SinaMobasheri
6. September um 21:35 Uhr
Matthew McCullough
Wenn wir die Antwort von IAdapter nehmen und neu formatieren, haben wir:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
Als nächstes würde ich empfehlen, dies zu einem natürlichen Teil Ihres Builds zu machen, anstatt etwas explizit aufzurufen. Um dies zu einem integralen Bestandteil Ihres Builds zu machen, fügen Sie dieses Plugin zu Ihrer hinzu pom.xml
und binde es an die package
Lebenszyklus-Ereignis. Ein Problem ist jedoch, dass Sie anrufen müssen assembly:single
Ziel, wenn Sie dies in Ihre pom.xml einfügen, während Sie “assembly:assembly” aufrufen würden, wenn Sie es manuell von der Befehlszeile aus ausführen würden.
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
[...]
</plugins>
[...]
</build>
</project>
In meinem Fall war maven-assembly-plugin ausreichend. Danke
– Kampaii
8. September um 6:31
Peter Mortensen
Verwenden Sie die maven-shade-plugin um alle Abhängigkeiten in eine Über-JAR-Datei zu packen. Es kann auch verwendet werden, um eine ausführbare JAR-Datei zu erstellen, indem die Hauptklasse angegeben wird. Nachdem ich versucht hatte, maven-assembly und maven-jar zu verwenden, stellte ich fest, dass dieses Plugin meinen Anforderungen am besten entsprach.
Ich fand dieses Plugin besonders nützlich, da es den Inhalt bestimmter Dateien zusammenführt, anstatt sie zu überschreiben. Dies ist erforderlich, wenn es Ressourcendateien gibt, die in allen JAR-Dateien denselben Namen haben, und das Plug-in versucht, alle Ressourcendateien zu packen.
Siehe das Beispiel unten:
<plugins>
<!-- This plugin provides the capability to package
the artifact in an über-JAR file, including
its dependencies and to shade - i.e. rename -
the packages of some of the dependencies. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<!-- Signed JAR files-->
<excludes>
<exclude>bouncycastle:bcprov-jdk15</exclude>
</excludes>
</artifactSet>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- Main class -->
<mainClass>com.main.MyMainClass</mainClass>
</transformer>
<!-- Use resource transformers to prevent file overwrites -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>properties.properties</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>applicationContext.xml</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/cxf/cxf.extension</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>META-INF/cxf/bus-extensions.xml</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
In meinem Fall war maven-assembly-plugin ausreichend. Danke
– Kampaii
8. September um 6:31
Peter Mortensen
Sie können das Maven-Shade-Plugin verwenden, um eine Über-JAR-Datei wie unten zu erstellen:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
Bitte erläutern Sie, auf welches Ziel des Abhängigkeits-Plugins Sie sich beziehen. Ich kenne kein Ziel, das das tut, was die ursprüngliche Frage verlangt: alle Abhängigkeiten entweder A) durch Umpacken in das Autoren-Jar zu legen oder B) ein ausführbares JAR zu erstellen, das die anderen in einem Klassenpfad von MANIFEST.MF enthält
– Matthew McCullough
11. März 2009 um 15:11 Uhr
Dies könnte für Sie nützlich sein rationaljava.com/2015/02/…
– Dan
2. Februar 2015 um 19:01 Uhr
2 Beispiele: tugay.biz/2015/12/a-standalone-java-web-application-with.html tugay.biz/2016/11/how-did-i-create-executable-jar-with.html
– Koray Tugay
30. März 2017 um 6:54 Uhr
Siehe stackoverflow.com/questions/35217128/…
– Thanga
11. September 2017 um 8:18 Uhr