Usa "maven-shade-plugin" per creare solo 1 jar eseguibile con tutte le dipendenze richieste per il tuo progetto Java o Spring?
Pubblicato: 2016-11-16Basta creare un file
Crunchify.jar
con tutte le dipendenze al suo interno
La scorsa settimana ho scritto un tutorial su come utilizzare maven-resources-plugin
, maven-dependency-plugin
e maven-jar-plugin
per generare il tuo progetto Jar eseguibile completo? Di conseguenza crea/copia tutti i file richiesti nella cartella /target/Crunchify
.
Before:
utilizzo dei plug-in maven-resource, maven-dependency, maven-jar:
After:
utilizzando il plug-in Maven-Shade:
Iniziamo su come ottenere il risultato di cui sopra:
Qui come vedi, abbiamo raggruppato tutto da Java Project in just one file
e abbiamo dato il nome Crunchify.jar
(con tutti i file all'interno).
Pochi giorni fa non avevo idea di come ottenerlo poiché volevo creare una runnable binary distribution of a standalone Java application
utilizzando Maven. In altre parole:
- Come creare un barattolo eseguibile basato su primavera con Maven?
- Creazione di una distribuzione binaria eseguibile con Maven per Java + Spring + Altre dipendenze
- Come creare progetti Java + Spring con Maven?
Normalmente in Maven, ci affidiamo alla gestione delle dipendenze. Un artefatto contiene solo le classi/risorse di se stesso. Maven sarà responsabile di scoprire tutti gli artefatti (JAR, ecc.) Da cui dipende il progetto, durante la compilazione e l'esecuzione, ecc.
Con l'aiuto del maven -shade- plugin
sono stato in grado di raggiungere questo obiettivo . Fornisce la capacità di impacchettare l'artefatto in un uber-jar (One major file jar)
, comprese le sue dipendenze e di ombreggiare, cioè rinominare, i pacchetti di alcune delle dipendenze.
Nel mio progetto ho così tante altre dipendenze, ad esempio Spring Framework, JSON, strumenti di terze parti, ecc. Di seguito è riportato solo un progetto di esempio, ma il mio file .jar di produzione ha raggiunto una dimensione di ~5.2MB big
.
Un
uber-jar
è qualcosa che prende tutte le dipendenze, estrae il contenuto delle dipendenze e lo inserisce in un JAR, con le classi/risorse del progetto stesso. Avendo tale uber-jar, èeasy for execution
, perché avrai bisogno di un solo grande JAR invece di tonnellate di piccoli JAR per eseguire la tua app. In alcuni casi facilita anche la distribuzione.
Per ottenere ciò, è necessario aggiornare il file pom.xml.
Passo 1
Dai un'occhiata al file pom.xml
completo. Principalmente saresti interessato al 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 > |
Come puoi vedere qui, sto usando Resource Transformers
nel file pom.xml. L'aggregazione di classes/resources
da diversi artefatti in un Crunchify JAR
è semplice fintanto che non vi sono sovrapposizioni. In caso contrario, è necessaria una sorta di logica per unire le risorse da più JAR. È qui che entrano in gioco i trasformatori di risorse.

Passo 2
Dopo aver aggiunto maven-shade-plugin
al tuo file pom.xml
, usa semplicemente il comando seguente per costruire il tuo progetto.
1 |
mvn clean install |
E dovresti vedere un Crunchify.jar
(uber-jar) creato con all dependencies mentioned in pom.xml file
all'interno.
Passaggio 3
Vai alla cartella di destinazione del tuo progetto e vedrai il file Crunchify.jar creato. Basta usare il comando
$bash> java -jar Crunchify.jar
per eseguire il tuo progetto.
Hai qualcosa da aggiungere? Aggiungilo alla sezione commenti qui sotto. Divertiti, buona giornata e buona codifica.