with sirve que pom plugin para org compiler java maven-2 build-process maven-plugin uberjar

java - sirve - ¿Es posible crear un contenedor "uber" que contenga las clases de proyecto y las dependencias del proyecto como archivos jar con un archivo de manifiesto personalizado?



maven-resources-plugin (4)

He usado FatJar para esto en el pasado. http://fjep.sourceforge.net/

Creé una aplicación relativamente simple, el cliente querría hacer doble clic en un ejecutable y hacer que funcione. Instaladores o dependencias están fuera de cuestión. Fatjar compiló las bibliotecas del proyecto y hizo referencia a los archivos de Eclipse en una jarra ejecutable de varios megabytes para mí. Perfecto.

Estoy tratando de crear un archivo ejecutable (usando maven) que contenga las clases de proyecto y sus dependencias con un archivo de manifiesto que tenga la entrada para la clase principal y la entrada de ruta de clase que apunta a las dependencias empaquetadas en la raíz del contenedor ;algo como esto :

Archivo de manifiesto:

..... Main-Class : com.acme.MainClass Class-Path : dependecy1.jar dependecy2.jar .....

Tarro:

jar-root |-- .... |-- com/acme/../*.class |-- dependecy1.jar `-- dependecy2.jar

Estoy usando maven-jar-plugin para crear el archivo manifest y el maven-shade-plugin para crear el jar "uber" pero las dependencias se desempaquetan y se agregan como clases a mi jar.


Sé de dos productos que hacen esto:

  • Uno se llama ''bigjar'', pero ese es un término demasiado general para ser útil en una búsqueda en Google; No pude encontrarlo
  • El otro se llama ''onejar''. Hay bastantes referencias al mismo y pretende hacer lo que necesita.

Aquí hay una publicación de alguien que usa OneJar en una asamblea de Maven:

http://5341.com/list/55/498657.html



En realidad, no verifiqué 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 jar-with-dependencies predefinido.

Simplemente agregue este fragmento a su pom.xml para 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á tu uberjar:

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

Pero, una vez más, el comportamiento predeterminado de este descriptor es 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 hacerlo, primero, cree su descriptor de conjunto, 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>

Luego, configure maven-assembly-plugin para usar este descriptor y agregar las dependencias a la entrada Class-Path 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 ejecute mvn assembly:assembly para producir su uberjar.

Opcionalmente, elimine el comentario del elemento de executions para vincular el complemento de ensamblaje en la fase del package (y haga que el ensamblaje se produzca como parte de la compilación normal).