create - maven encoding iso-8859-1
Construyendo un frasco gordo usando maven (6)
Agregue el siguiente complemento a su pom.xml
La última versión se puede encontrar en https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>CHOOSE LATEST VERSION HERE</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Después de configurar este plug-in, ejecutar el mvn package
producirá dos mvn package
: uno que contenga solo las clases del proyecto, y un segundo jar gordo con todas las dependencias con el sufijo "-jar-with-dependencies".
si quieres una configuración correcta de classpath
en tiempo de ejecución, entonces también agrega el siguiente complemento
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Tengo una base de código que quiero distribuir como jar. También tiene una dependencia en jarras externas, que quiero agrupar en el jar final.
Escuché que esto puede hacerse usando maven-assembly-plug-in
, pero no entiendo cómo. ¿Podría alguien señalarme algunos ejemplos?
En este momento, estoy usando el frasco de grasa para agrupar el frasco final. Quiero lograr lo mismo usando maven.
Puede usar el onejar-maven-plugin para el empaquetado. Básicamente, ensambla su proyecto y sus dependencias en un solo contenedor, que incluye no solo el archivo jar del proyecto, sino también todas las dependencias externas como un "contenedor de jarras", por ejemplo
<build>
<plugins>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Nota 1: las opciones de configuración están disponibles en la página de inicio del proyecto.
Nota 2: Por una razón u otra, el proyecto onejar-maven-plugin no se publica en Maven Central. Sin embargo, jolira.com rastrea el proyecto original y lo publica con groupId com.jolira
.
Puedes usar el maven-shade-plugin .
Después de configurar el plugin de sombreado en su compilación, el mvn package
del comando creará un solo jar con todas las dependencias fusionadas en él.
Tal vez quieras maven-shade-plugin
, bundle dependencies, minimizar el código no utilizado y ocultar las dependencias externas para evitar conflictos.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
<createDependencyReducedPom>true</createDependencyReducedPom>
<dependencyReducedPomLocation>
${java.io.tmpdir}/dependency-reduced-pom.xml
</dependencyReducedPomLocation>
<relocations>
<relocation>
<pattern>com.acme.coyote</pattern>
<shadedPattern>hidden.coyote</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Referencias
Una alternativa es usar el plugin maven shade para construir un uber-jar
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version> Your Version Here </version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
de hecho, agregando el
<archive>
<manifest>
<addClasspath>true</addClasspath>
<packageName>com.some.pkg</packageName>
<mainClass>com.MainClass</mainClass>
</manifest>
</archive>
declaración a maven-jar-plugin no agrega la entrada de clase principal al archivo de manifiesto para mí. Tuve que agregarlo al complemento maven-assembly para poder incluirlo en el manifiesto