¿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?

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:

 .....
 Clase principal: com.acme.MainClass
 Ruta de clase: dependenciacy1.jar dependecy2.jar
 .....

Tarro:

 jar-root
 | - ...
 | - com / acme /../*. clase
 | - 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.

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:

  org.apache.maven.plugins maven-assembly-plugin    my.package.to.my.MainClass     

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:

  uberjar  jar  false   false runtime false     ${project.build.outputDirectory} /    

Luego, configure maven-assembly-plugin para usar este descriptor y agregar las dependencias a la entrada Class-Path del manifiesto:

  org.apache.maven.plugins maven-assembly-plugin   src/assembly/uberjar.xml    my.package.to.my.MainClass true      

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 comstackción normal).

OneJar tiene un plugin maven2 .

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.

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