Ich möchte mein Projekt in ein einziges ausführbares JAR-Paket verpacken, um es zu verteilen.
Wie kann ich ein Maven-Projekt dazu bringen, alle abhängigen JARs in mein Ausgabe-JAR zu packen?
Ich möchte mein Projekt in ein einziges ausführbares JAR-Paket verpacken, um es zu verteilen.
Wie kann ich ein Maven-Projekt dazu bringen, alle abhängigen JARs in mein Ausgabe-JAR zu packen?
Eine weitere Option, wenn Sie wirklich die Inhalte der anderen JARs in Ihr einzelnes resultierendes JAR umpacken wollen, ist das Maven Assembly-Plugin . Es entpackt und packt dann alles wieder in ein Verzeichnis über <unpack>true</unpack>
. Dann gibt es einen zweiten Durchgang, bei dem das Ganze zu einem großen JAR zusammengefügt wird.
Eine weitere Option ist das OneJar-Plugin . Damit werden die oben genannten Umpackvorgänge in einem Schritt durchgeführt.
Sie könnten die maven-shade-plugin
y maven-jar-plugin
.
maven-shade-plugin
packt Ihre Klassen und alle Abhängigkeiten in eine einzige Jar-Datei.maven-jar-plugin
um die Hauptklasse Ihres ausführbaren jar anzugeben (siehe Den Klassenpfad einrichten , Kapitel "Das Jar ausführbar machen").Beispiel einer POM-Konfiguration für maven-jar-plugin
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Erstellen Sie schließlich das ausführbare jar durch Aufrufen:
mvn clean package shade:shade
Das Shade-Plugin hat nun die Möglichkeit, den Main-Class-Eintrag im Manifest zu spezifizieren: maven.apache.org/plugins/maven-shade-plugin/examples/
Das funktioniert so:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
Das Auspacken muss in der Phase "generate-resources" erfolgen, sonst wird es nicht als Ressource berücksichtigt.
Dieses Problem tritt auf: org.apache.maven.lifecycle.LifecycleExecutionException: Das Ziel org.apache.maven.plugins:maven-dependency-plugin:3.1.2:unpack-dependencies (unpack-dependencies) für Projektdienste konnte nicht ausgeführt werden: Unbekannter Archivierungstyp
Ken Liu hat meiner Meinung nach Recht. Das Maven Dependency Plugin erlaubt es Ihnen, alle Abhängigkeiten zu erweitern, die Sie dann als Ressourcen behandeln können. Dies erlaubt es Ihnen, sie in die Haupt Artefakt. Die Verwendung des Assembly-Plugins erzeugt ein sekundäres Artefakt, das schwer zu ändern sein kann - in meinem Fall wollte ich benutzerdefinierte Manifest-Einträge hinzufügen. Mein pom endete als:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
<targetPath>/</targetPath>
</resource>
</resources>
</build>
...
</project>
Um dieses Problem zu lösen, werden wir das Maven Assembly Plugin verwenden, das die JAR-Datei zusammen mit den JAR-Dateien der Abhängigkeiten in eine einzige ausführbare JAR-Datei verwandelt. Fügen Sie einfach die folgende Plugin-Konfiguration in Ihre pom.xml-Datei ein.
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.your.package.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>
</pluginManagement>
</build>
Vergessen Sie danach nicht, das MAVEN-Tool mit folgendem Befehl zu starten mvn clean compile assembly:single
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.
15 Stimmen
Bitte erklären 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) in das Autoren-Jar durch Umpacken zu packen, oder B) ein ausführbares Jar zu erstellen, das die anderen in einem Klassenpfad von MANIFEST.MF hat
2 Stimmen
Dies könnte für Sie nützlich sein rationaljava.com/2015/02/
1 Stimmen
2 Beispiele: tugay.biz/2015/12/a-standalone-java-web-anwendung-mit.html tugay.biz/2016/11/wie-erstelle-ich-ein-ausführbares-jar-mit.html
2 Stimmen
Siehe stackoverflow.com/questions/35217128/
0 Stimmen
Für Gradle siehe den Stackoverflow-Beitrag: Fat/Uber JAR in Gradle erstellen .