2009-12-02 13 views
26

Estoy tratando de crear un archivo ejecutable (usando maven) que contiene las clases de proyecto y sus dependencias con un archivo de manifiesto que tiene la entrada para la clase principal y la entrada de ruta de clase que apunta a las dependencias empaquetadas en la raíz de el frasco; algo como esto:¿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?

archivo de manifiesto:

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

Jar:

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

estoy usando el experto-jar-plugin para crear el archivo de manifiesto y el maven-sombra -plugin para crear el "ub er "jar pero las dependencias están desempaquetadas y agregadas como clases a mi jar.

Respuesta

56

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).

+4

+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. –

+1

ensamblaje: el ensamblaje ha sido reemplazado por ensamblaje : soltero recientemente. (estoy en la versión 2.3 del complemento de ensamblaje) –

+0

plugin de ensamblaje es un plugin al igual que el plugin de sombreado, por lo que no es "incorporado" –

0

sé de dos productos que hacen esto:

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

Aquí hay un post de alguien que usa onejar en un montaje de Maven:

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

2

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

Había creado una aplicación relativamente simple, el cliente iba a querer hacer doble clic en un ejecutable y hacer que simplemente 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.

+0

¿Es esto un plugin de Eclipse? Si es así, no veo cómo responde la pregunta. El OP está pidiendo una solución maven ... –

+0

Tienes razón, leí mal esa parte. Creo que estaba pensando que podría aplicarse a otras áreas, ya que todos los IDEs son poco más que envoltorios de envoltorios de scripts. – Karl

Cuestiones relacionadas