Folosiți „maven-shade-plugin” pentru a crea doar 1 jar executabil cu toate dependențele necesare pentru proiectul dumneavoastră Java sau Spring?
Publicat: 2016-11-16Doar creați un fișier
Crunchify.jar
cu toate dependențele în interiorul acestuia
Săptămâna trecută am scris un tutorial despre cum să utilizați maven-resources-plugin
, maven-dependency-plugin
și maven-jar-plugin
pentru a genera proiectul jar executabil complet? Ca rezultat, creează / copiează toate fișierele necesare în folderul /target/Crunchify
.
Before:
Folosind pluginuri maven-resource, maven-dependency, maven-jar:
After:
Folosind pluginul Maven-shade:
Să începem cum să obținem rezultatul de mai sus:
Aici, după cum vedeți, am grupat totul de la Java Project într just one file
și am dat numele Crunchify.jar
(cu toate fișierele în interior).
Cu câteva zile în urmă nu aveam idee cum să realizez asta, deoarece voiam să creez o runnable binary distribution of a standalone Java application
folosind Maven. Cu alte cuvinte:
- Cum se creează un borcan executabil pe bază de primăvară cu Maven?
- Crearea unei distribuții binare rulabile cu Maven pentru Java + Spring + Alte dependențe
- Cum să construiți proiecte Java + Spring cu Maven?
În mod normal, în Maven, ne bazăm pe managementul dependenței. Un artefact conține doar clasele/resursele însuși. Maven va fi responsabil să afle toate artefactele (JAR-uri etc.) de care depinde proiectul, la compilare și pentru rulare etc.
Cu ajutorul maven -shade- plugin
am reușit să realizez acest obiectiv . Oferă capacitatea de a împacheta artefactul într-un uber-jar (One major file jar)
, inclusiv dependențele sale și de a umbri – adică redenumi – pachetele unora dintre dependențe.
În proiectul meu am atât de multe alte dependențe, de exemplu Spring Framework, JSON, instrumente terțe etc. Mai jos este doar un exemplu de proiect, dar fișierul meu de producție .jar a ajuns la o dimensiune de ~5.2MB big
.
Un
uber-jar
este ceva care preia toate dependențele și extrage conținutul dependențelor și îl pune într-un singur JAR, cu clasele/resursele proiectului însuși. Având un astfel de uber-jar, esteeasy for execution
, deoarece veți avea nevoie de un singur JAR mare în loc de tone de JAR mici pentru a rula aplicația. De asemenea, ușurează distribuția în unele cazuri.
Pentru a realiza acest lucru, trebuie să actualizați fișierul pom.xml.
Pasul 1
Aruncă o privire la fișierul complet pom.xml
. În principal, ați fi interesat de eticheta <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 > |
După cum puteți vedea aici, folosesc Resource Transformers
în fișierul pom.xml. Agregarea classes/resources
din mai multe artefacte într-un singur Crunchify JAR
este simplă atâta timp cât nu există suprapunere. În caz contrar, este necesară un fel de logică pentru a îmbina resursele din mai multe JAR. Aici intervin transformatoarele de resurse.

Pasul 2
Odată ce adăugați maven-shade-plugin
la fișierul pom.xml
, utilizați comanda de mai jos pentru a vă construi proiectul.
1 |
mvn clean install |
Și ar trebui să vedeți un Crunchify.jar
(uber-jar) creat cu all dependencies mentioned in pom.xml file
interior.
Pasul 3
Accesați folderul țintă al proiectului și veți vedea fișierul Crunchify.jar creat. Folosește doar comanda
$bash> java -jar Crunchify.jar
pentru a vă executa proiectul.
Ai ceva de adăugat? Adaugă-l în secțiunea de comentarii de mai jos. Bucurați-vă, să aveți o zi grozavă înainte și Happy Coding.