2010-01-07 26 views
77

Soy relativamente nuevo en el mantra Maven, pero estoy tratando de construir un jarrón ejecutable de línea de comandos con Maven. He configurado mis dependencias, pero cuando ejecuto mvn install e intento ejecutar el jar, suceden dos cosas. Primero, no se encuentra ninguna clase principal, que se pueda corregir. Cuando lo corrigí, recibí errores de ejecución que indicaban que no se podían encontrar las clases.Creando un jar ejecutable con Maven 2

Maven no empaqueta mis bibliotecas de dependencias dentro del contenedor, por lo que no puedo ejecutar el contenedor como una aplicación independiente. ¿Cómo puedo corregir esto?

+0

Puede usar IDE para el experto como Netbenas – SjB

+7

@SjB: y que resuelve mágicamente el problema? No lo creo. –

+1

¿Duplicado exacto de qué, exactamente? –

Respuesta

105

La manera más fácil de hacer esto sería crear un ensamblado utilizando el descriptor maven-assembly-plugin y el jar-with-dependencies predefinido. También necesitarás generar un manifiesto con una entrada de clase principal para este jar de uber. El fragmento de código siguiente muestra cómo configurar el plugin de montaje para hacerlo:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

Entonces, para generar el conjunto, basta con ejecutar:

mvn assembly:assembly 

Si desea generar el conjunto como parte de su construcción , sólo tiene que obligar a la mojo assembly:single a la fase de paquete:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

Y sólo tiene que ejecutar:

mvn package 
+1

El plugin maven-shade-plugin también funciona de manera similar y está dedicado a este propósito. –

+4

Esto no funciona en primavera, y otras bibliotecas que esperan múltiples recursos con el mismo nombre en la ruta de clase. En el caso de la primavera, META-INF \ spring.schemas se incluye en varios archivos jar (beans, jdbc, etc.) y se utiliza para configurar el soporte del espacio de nombres XML para el analizador XML. Si prueba 'jar-with-dependencies', el pasing application-context.xml fallará en el tiempo de ejecución con algo como "org.xml.sax.SAXParseException: cvc-elt.1: No se puede encontrar la declaración del elemento 'beans'". –

+0

@David Maven no resolverá una "limitación" de Java. Simplemente empaquete su aplicación limpiamente (es decir, no en un uberjar) en ese caso. –

25

Maven no empaqueta sus dependencias dentro de su archivo jar, porque generalmente no lo hace con los programas Java.

En su lugar entrega las dependencias junto con su archivo jar y las menciona en the Class-Path header of the Manifest. Para obtener esta ruta, deberá habilitar la propiedad addClasspath (documentada here) para el maven-jar-plugin.

Si realmente desea incluir todas sus dependencias en su archivo jar, puede usar el complemento Maven Assembly para crear un jar-with-dependencies.

+4

+1 He tenido dificultades para encontrar información sobre cómo se diseñan * los programas java *. y distribuido, especialmente con Maven. –

6

Estoy de acuerdo con Joachim Sauer,

En lugar de utilizar jar-con-dependencia debe configurar el plugin frasco así en tu pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <index>true</index> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>[mainClassFullName]</mainClass> 
      </manifest> 
      <manifestEntries> 
       <mode>development</mode> 
       <url>${project.url}</url> 
       <key>value</key> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

Y usar esta configuración de montaje de agregue las dependencias de jar a su ensamblado:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>zip-with-jars</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySets> 
    <dependencySet> 
    <outputDirectory>/</outputDirectory> 
    <useProjectArtifact>true</useProjectArtifact> 
    <unpack>false</unpack> 
    <scope>runtime</scope> 
    </dependencySet> 
</dependencySets> 
    </dependencySets> 
</assembly> 
8

Esto es lo que haría para proyectos pequeños. La mayoría de las veces no quieres un vaso grande.

para construir: mvn dependencia limpia: copia de un paquete de dependencias

a ejecutar (en dir objetivo): java -cp myjar.jar: ./ dependencia/* com.something .MyClass

+0

+1 por simple solución sin configuración de no-pom. –

+0

¡Genial! Guardé esto en mi Makefile, en el mismo directorio con pom.xml. compilación: \ n mvn .... (lo que dijiste) – Roboprog

+0

Gracias. Después de buscar en internet por más de 2 horas encontré esta respuesta muy útil ... – Shekhar

2

Solo agregue el siguiente código en pom.xml y Ejecutar como: maven: install.El jar se creará en la carpeta de destino de eclipse, que se puede usar como "java -jar Hello.jar". pero asegúrese de que el nombre de la clase principal se da com.abc.HelloWorld.java

<build> 
<plugins> 
<plugin> 
<groupid>org.apache.maven.plugins</groupid> 
<artifactid>maven-shade-plugin</artifactid> 
<executions> 
<execution> 
<phase>package</phase> 
<goals> 
<goal>shade</goal> 
</goals> 
<configuration> 
<finalname>HelloW</finalname> 
<transformers> 
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
<manifestentries> 
<main-class>com.abc.HelloWorld.java</main-class> 
<build-number>1</build-number> 
</manifestentries> 
</transformer> 
</transformers> 
</configuration> 
</execution> 
</executions> 
</plugin> 
</plugins> 

</build> 
Cuestiones relacionadas