Verwenden Sie „maven-shade-plugin“, um nur 1 ausführbares JAR mit allen erforderlichen Abhängigkeiten für Ihr Java- oder Spring-Projekt zu erstellen?
Veröffentlicht: 2016-11-16Erstellen Sie einfach eine
Crunchify.jar
-Datei mit allen darin enthaltenen Abhängigkeiten
Letzte Woche habe ich ein Tutorial zur Verwendung von maven-resources-plugin
, maven-dependency-plugin
& maven-jar-plugin
, um Ihr vollständiges ausführbares Jar-Projekt zu generieren. Als Ergebnis erstellt / kopiert es alle erforderlichen Dateien in den Ordner /target/Crunchify
.
Before:
Verwendung von maven-resource-, maven-dependency-, maven-jar-Plugins:
Nachher After:
Verwendung des Maven-Shade-Plugins:
Beginnen wir damit, wie Sie das obige Ergebnis erzielen:
Wie Sie sehen, haben wir hier alles von Java Project in just one file
gebündelt und den Namen Crunchify.jar
(mit allen darin enthaltenen Dateien) gegeben.
Vor ein paar Tagen hatte ich keine Ahnung, wie ich das erreichen sollte, da ich mit Maven runnable binary distribution of a standalone Java application
erstellen wollte. Mit anderen Worten:
- Wie erstelle ich ein springbasiertes ausführbares JAR mit Maven?
- Erstellen einer lauffähigen Binärdistribution mit Maven für Java + Spring + andere Abhängigkeiten
- Wie erstellt man Java + Spring-Projekte mit Maven?
Normalerweise verlassen wir uns in Maven auf das Abhängigkeitsmanagement. Ein Artefakt enthält nur die Klassen/Ressourcen seiner selbst. Maven ist dafür verantwortlich, alle Artefakte (JARs usw.) herauszufinden, von denen das Projekt abhängig ist, wenn es kompiliert und ausgeführt wird usw.
Mit Hilfe von maven -shade- plugin
konnte ich dieses Ziel erreichen . Es bietet die Möglichkeit, das Artefakt in ein uber-jar (One major file jar)
zu packen, einschließlich seiner Abhängigkeiten, und die Pakete einiger der Abhängigkeiten zu schattieren – dh umzubenennen.
In meinem Projekt habe ich so viele andere Abhängigkeiten, dh Spring Framework, JSON, Tools von Drittanbietern usw. Unten ist nur ein Beispielprojekt, aber meine Produktions-JAR-Datei war ~5.2MB big
.
Ein
uber-jar
ist etwas, das alle Abhängigkeiten nimmt und den Inhalt der Abhängigkeiten extrahiert und in das eine JAR mit den Klassen/Ressourcen des Projekts selbst legt. Durch ein solches Uber-JAR isteasy for execution
, da Sie nur ein großes JAR anstelle von Tonnen kleiner JARs benötigen, um Ihre App auszuführen. Es erleichtert in einigen Fällen auch die Verteilung.
Um dies zu erreichen, müssen Sie Ihre pom.xml-Datei aktualisieren.
Schritt 1
Sehen Sie sich die vollständige pom.xml
-Datei an. Sie wären hauptsächlich am Tag <build>
interessiert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi : schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion > 4.0.0 < / modelVersion > < groupId > CrunchifyMavenBuildPlugins < / groupId > < artifactId > CrunchifyMavenBuildPlugins < / artifactId > < version > 0.0.1 - SNAPSHOT < / version > < name > CrunchifyMavenBuildPlugins < / name > < properties > < project . build . sourceEncoding > UTF - 8 < / project . build . sourceEncoding > < / properties > < dependencies > < dependency > < groupId > log4j < / groupId > < artifactId > log4j < / artifactId > < version > 1.2.17 < / version > < / dependency > < dependency > < groupId > com . googlecode . json - simple < / groupId > < artifactId > json - simple < / artifactId > < version > 1.1 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > commons - beanutils < / groupId > < artifactId > commons - beanutils < / artifactId > < version > 1.8.3 < / version > < / dependency > < dependency > < groupId > commons - collections < / groupId > < artifactId > commons - collections < / artifactId > < version > 3.2.1 < / version > < / dependency > < dependency > < groupId > commons - configuration < / groupId > < artifactId > commons - configuration < / artifactId > < version > 1.10 < / version > < / dependency > < dependency > < groupId > commons - io < / groupId > < artifactId > commons - io < / artifactId > < version > 2.4 < / version > < / dependency > < dependency > < groupId > javax . mail < / groupId > < artifactId > mail < / artifactId > < version > 1.4.7 < / version > < / dependency > < dependency > < groupId > javax . servlet < / groupId > < artifactId > servlet - api < / artifactId > < version > 2.5 < / version > < / dependency > < dependency > < groupId > org . json < / groupId > < artifactId > json < / artifactId > < version > 20140107 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis - saaj < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > wsdl4j < / groupId > < artifactId > wsdl4j < / artifactId > < version > 1.6.3 < / version > < / dependency > < dependency > < groupId > com . google . zxing < / groupId > < artifactId > core < / artifactId > < version > 2.0 < / version > < / dependency > < / dependencies > < build > < pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - compiler - plugin < / artifactId > < version > 2.3.1 < / version > < configuration > < source > 1.7 < / source > < target > 1.7 < / target > < / configuration > < / plugin > < / plugins > < / pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - shade - plugin < / artifactId > < version > 1.7 < / version > < executions > < execution > < phase > package < / phase > < goals > < goal > shade < / goal > < / goals > < configuration > < ! -- Optional Start -- > < finalName > Crunchify < / finalName > < shadedArtifactAttached > true < / shadedArtifactAttached > < shadedClassifierName > jar - with - dependencies < / shadedClassifierName > < ! -- Optional End -- > < transformers > < transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" > < mainClass > com . crunchify . tutorial . CrunchifyMain < / mainClass > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . handlers < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . schemas < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . tooling < / resource > < / transformer > < / transformers > < / configuration > < / execution > < / executions > < / plugin > < / plugins > < / build > < / project > |
Wie Sie hier sehen können, verwende ich Resource Transformers
in der Datei pom.xml. Das Zusammenfassen von classes/resources
aus mehreren Artefakten in einem Crunchify JAR
ist einfach, solange es keine Überschneidungen gibt. Andernfalls ist eine Art Logik zum Zusammenführen von Ressourcen aus mehreren JARs erforderlich. Hier setzen Ressourcentransformatoren an.

Schritt 2
Sobald Sie maven-shade-plugin
zu Ihrer pom.xml
-Datei hinzugefügt haben, verwenden Sie einfach den folgenden Befehl, um Ihr Projekt zu erstellen.
1 |
mvn clean install |
Und Sie sollten eine Crunchify.jar
-Datei (uber-jar) sehen, die mit all dependencies mentioned in pom.xml file
erstellt wurde.
Schritt 3
Gehen Sie zum Zielordner Ihres Projekts und Sie sehen die erstellte Crunchify.jar-Datei. Verwenden Sie einfach den Befehl
$bash> java -jar Crunchify.jar
, um Ihr Projekt auszuführen.
Haben Sie etwas hinzuzufügen? Fügen Sie es dem Kommentarbereich unten hinzu. Viel Spaß, einen schönen Tag und viel Spaß beim Programmieren.