En realidad, no he comprobado qué está haciendo exactamente el maven-shade-plugin
(o cualquier otro plugin) ya que maven 2 tiene todo incorporado para crear un megajar o uberjar. Solo tiene que usar el complemento maven-assembly-plugin con el descriptor predefinido jar-with-dependencies
.
Apenas añada este fragmento a su pom.xml
de personalizar el manifiesto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Y el siguiente comando generará su uberjar:
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
Pero, de nuevo, el comportamiento predeterminado de este descriptor es para descomprimir dependencias (como el maven-shade-plugin). Para ser sincero, no entiendo por qué esto es un problema pero, si esto no es realmente lo que quieres, puedes usar tu propio descriptor de ensamblaje personalizado.
Para ello, en primer lugar, crear su descriptor de montaje, digamos src/assembly/uberjar.xml
, con el siguiente contenido:
<assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
continuación, configure el experto-montaje-plugin para utilizar este descriptor y añadir las dependencias de Class-Path
la entrada del manifiesto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/assembly/uberjar.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<!--
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
-->
</plugin>
Finalmente ejecutar mvn assembly:assembly
para producir su uberjar.
Opcionalmente, elimine el comentario del elemento executions
para vincular el complemento de ensamblaje en la fase package
(y haga que el ensamblaje se produzca como parte de la construcción normal).
+1, increíblemente útil respuesta. Me imagino que algunos productores de software, especialmente fuera del sistema operativo, pueden prohibir el "desmontaje/ingeniería inversa" de su producto, o insistir en que su embalaje se mantenga tal como está, incluido el nombre del archivo, etc. –
ensamblaje: el ensamblaje ha sido reemplazado por ensamblaje : soltero recientemente. (estoy en la versión 2.3 del complemento de ensamblaje) –
plugin de ensamblaje es un plugin al igual que el plugin de sombreado, por lo que no es "incorporado" –