¿Usar "maven-shade-plugin" para crear solo 1 jar ejecutable con todas las dependencias requeridas para su proyecto Java o Spring?
Publicado: 2016-11-16Simplemente cree un archivo
Crunchify.jar
con todas las dependencias dentro de él
La semana pasada escribí un tutorial sobre cómo usar maven-resources-plugin
, maven-dependency-plugin
y maven-jar-plugin
para generar su Proyecto Jar ejecutable completo. Como resultado, crea o copia todos los archivos necesarios en la carpeta /target/Crunchify
.
Before:
usar los complementos maven-resource, maven-dependency, maven-jar:
After:
usando el complemento maven-shade:
Comencemos sobre cómo lograr el resultado anterior:
Aquí, como puede ver, hemos incluido todo, desde Java Project en just one file
y le hemos dado el nombre Crunchify.jar
(con todos los archivos dentro).
Hace unos días, no tenía idea de cómo lograrlo, ya que quería crear una runnable binary distribution of a standalone Java application
utilizando Maven. En otras palabras:
- ¿Cómo crear un archivo ejecutable basado en Spring con Maven?
- Creación de una distribución binaria ejecutable con Maven para Java + Spring + Otras dependencias
- ¿Cómo construir proyectos Java + Spring con Maven?
Normalmente en Maven, confiamos en la gestión de dependencias. Un artefacto solo contiene las clases/recursos de sí mismo. Maven será responsable de descubrir todos los artefactos (JAR, etc.) de los que depende el proyecto, al compilar y ejecutar, etc.
Con la ayuda del maven -shade- plugin
pude lograr este objetivo . Proporciona la capacidad de empaquetar el artefacto en un uber-jar (One major file jar)
, incluidas sus dependencias y sombrear, es decir, cambiar el nombre, los paquetes de algunas de las dependencias.
En mi proyecto, tengo muchas otras dependencias, es decir, Spring Framework, JSON, herramientas de terceros, etc. A continuación se muestra solo un proyecto de muestra, pero mi archivo .jar de producción resultó tener un tamaño de ~5.2MB big
.
Un
uber-jar
es algo que toma todas las dependencias, extrae el contenido de las dependencias y lo coloca en un JAR, con las clases/recursos del proyecto en sí. Al tener tal uber-jar, eseasy for execution
, porque solo necesitará un JAR grande en lugar de toneladas de JAR pequeños para ejecutar su aplicación. También facilita la distribución en algunos casos.
Para lograr esto, debe actualizar su archivo pom.xml.
Paso 1
Eche un vistazo al archivo pom.xml
completo. Principalmente, le interesaría la etiqueta <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 > |
Como puede ver aquí, estoy usando Resource Transformers
en el archivo pom.xml. Agregar classes/resources
de varios artefactos en un Crunchify JAR
es sencillo siempre que no haya superposición. De lo contrario, se requiere algún tipo de lógica para fusionar recursos de varios JAR. Aquí es donde entran en juego los transformadores de recursos.

Paso 2
Una vez que agregue maven-shade-plugin
a su archivo pom.xml
, simplemente use el siguiente comando para construir su proyecto.
1 |
mvn clean install |
Y debería ver un Crunchify.jar
(uber-jar) creado con all dependencies mentioned in pom.xml file
dentro.
Paso 3
Vaya a la carpeta de destino de su proyecto y verá el archivo Crunchify.jar creado. Solo usa el comando
$bash> java -jar Crunchify.jar
para ejecutar su proyecto.
¿Tienes algo que añadir? Agréguelo a la sección de comentarios a continuación. Disfrute, tenga un gran día por delante y feliz codificación.