Użyj „maven-shade-plugin”, aby utworzyć tylko 1 plik wykonywalny ze wszystkimi wymaganymi zależnościami dla swojego projektu Java lub Spring?
Opublikowany: 2016-11-16Po prostu utwórz jeden plik
Crunchify.jar
ze wszystkimi zawartymi w nim zależnościami
W zeszłym tygodniu napisałem samouczek o tym, jak używać maven-resources-plugin
, maven-dependency-plugin
i maven-jar-plugin
do generowania pełnego wykonywalnego projektu Jar Project? W rezultacie tworzy / kopiuje wszystkie wymagane pliki do folderu /target/Crunchify
.
Before:
Korzystanie z wtyczek maven-resource, maven-dependency i maven-jar:
After:
Korzystanie z wtyczki maven-shade:
Zacznijmy od tego, jak osiągnąć powyższy wynik:
Tutaj, jak widać, połączyliśmy wszystko z Java Project w just one file
i nadaliśmy nazwę Crunchify.jar
(ze wszystkimi plikami w środku).
Kilka dni temu nie miałem pojęcia, jak to osiągnąć, ponieważ chciałem stworzyć runnable binary distribution of a standalone Java application
za pomocą Mavena. Innymi słowy:
- Jak za pomocą maven stworzyć wiosenny słój wykonywalny?
- Tworzenie działającej dystrybucji binarnej za pomocą Maven for Java + Spring + inne zależności
- Jak budować projekty Java + Spring za pomocą Mavena?
Zwykle w Maven polegamy na zarządzaniu zależnościami. Artefakt zawiera tylko same klasy/zasoby. Maven będzie odpowiedzialny za znalezienie wszystkich artefaktów (JARów itp.), od których projekt jest zależny, podczas kompilacji i uruchamiania itp.
Z pomocą maven -shade- plugin
udało mi się osiągnąć ten cel al. Daje możliwość spakowania artefaktu w uber-jar (One major file jar)
, w tym jego zależności i cieniowania – tj. zmiany nazwy – pakietów niektórych zależności.
W moim projekcie mam tak wiele innych zależności, tj. Spring Framework, JSON, narzędzia 3rd Party itp. Poniżej jest tylko przykładowy projekt, ale mój plik produkcyjny .jar wyszedł na ~5.2MB big
.
uber-jar
to coś, co pobiera wszystkie zależności i wyodrębnia zawartość zależności i umieszcza ją w jednym JAR, z klasami/zasobami samego projektu. Posiadanie takiego uber-jar jesteasy for execution
, ponieważ do uruchomienia aplikacji będziesz potrzebować tylko jednego dużego pliku JAR zamiast ton małych. W niektórych przypadkach ułatwia to również dystrybucję.
Aby to osiągnąć, musisz zaktualizować swój plik pom.xml.
Krok 1
Spójrz na kompletny plik pom.xml
. Głównie interesuje Cię tag <build>
.
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 > |
Jak widać tutaj używam Resource Transformers
w pliku pom.xml. Agregowanie classes/resources
z kilku artefaktów w jeden Crunchify JAR
jest proste, o ile nie nakładają się na siebie. W przeciwnym razie wymagana jest jakaś logika do scalania zasobów z kilku plików JAR. W tym miejscu wkraczają transformatory zasobów.

Krok 2
Po dodaniu maven-shade-plugin
do pliku pom.xml
wystarczy użyć poniższego polecenia, aby zbudować swój projekt.
1 |
mvn clean install |
Powinieneś zobaczyć jeden Crunchify.jar
(uber-jar) utworzony ze all dependencies mentioned in pom.xml file
.
Krok 3
Przejdź do folderu docelowego swojego projektu, a zobaczysz utworzony plik Crunchify.jar. Po prostu użyj polecenia
$bash> java -jar Crunchify.jar
, aby wykonać swój projekt.
Masz coś do dodania? Dodaj go do sekcji komentarzy poniżej. Miłego dnia, miłego dnia i szczęśliwego kodowania.