2011-07-08 11 views
5

Soy nuevo en maven y algo nuevo en java. Intenté google y fuentes relacionadas, pero no encontré uno que se pareciera a mi situación.dependencia no encontrada en tiempo de ejecución maven

Ahora mismo, tengo el proyecto maven X y Y. X se puede ver como una biblioteca compartida con algunas utilidades, Y es un JFrame simple con un "hello world" impreso y una llamada a un método estático en X.

Hago un "ejecutar como maven install" en el proyecto X, obtengo un "build successful". Agrego el proyecto X como dependencia en el proyecto Y (usando el pom-editor en Eclipse, navegando por el repositorio y ubicándolo). Hago un "ejecutar como maven package" en el proyecto Y, obtengo un "build successful". Al ejecutar el proyecto Y ya sea a través de java -jar o inspeccionar el contenedor producido, el proyecto X falta en todas partes y aparece una clase de lujo no encontrada. Eclipse lo encuentra y no hay errores de compilación en el editor de código fuente.

¿Por qué solo funciona en el editor de Eclipse y no como jar?

POM:

<dependency> 
     <groupId>com.company.deployment.shared</groupId> 
     <artifactId>com.company.deployment.shared</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <scope>compile</scope> 
    </dependency> 

Respuesta

7

Maven no produce un archivo JAR combinado para usted. Lo que Eclipse está haciendo es mirar la configuración de Maven y agregar todas las clases/jar requeridas a su classpath por usted cuando se ejecuta.

Si desea ejecutar su programa desde la línea de comandos, deberá agregar todos los JAR manualmente a su classpath.

Alternativamente, podría ejecutar su programa directly from Maven que debería configurar todas sus dependencias. Hay varias opciones según lo que desee hacer, es decir, si se trata de una aplicación que debe ejecutar un usuario final, puede consultar el one-jar Maven plugin.

0

No funciona porque Maven resuelve las dependencias al construir su proyecto, pero no pone mágicamente todas las dependencias en su jar. Se supone que ejecutar su aplicación con todas sus dependencias en la ruta de clase:

java -classpath X.jar;Y.jar com.foo.bar.Main 

O usted tiene que personalizar el plugin de maven jar con el fin de crear un jar ejecutable, como se describe here. Y también puede usar el complemento maven assemby para copiar todas las dependencias de su proyecto Y al directorio de destino, junto al Y.jar generado.

+0

Perdóname si encuentro esto difícil, vengo de un mundo .net y mi dpt de ventas me vendió un proyecto de Java para hacer. Pero por alguna razón, maven solo comprueba si las dependencias están ahí pero no las agrega. Gracias por la sugerencia sobre el archivo ejecutable, pero como está ahora, todas las dependencias faltan ... ¿Cómo puedo empaquetar esto de manera que mis clientes puedan usarlo? Espero que no necesiten la línea de comando para esto ...? – Helfdane

+0

@Helfdane: la razón por la que no pone las dependencias en su JAR es que esto no sería lo correcto en la mayoría de los casos. Y para los casos en que sí lo hay, hay una variedad de complementos para hacer eso. –

0

Le recomiendo que eche un vistazo al Maven shade plugin. Esto produce un "uber-jar" que comprende su proyecto y todas sus dependencias. También puede hacer otras cosas como establecer la clase de punto de entrada para hacer que su archivo JAR sea un JAR ejecutable.

+0

Lo echaré un vistazo, gracias por la punta. – Helfdane

1

También puede encontrar exec-maven-plugin útiles

mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ... 
mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist" 

Si el cliente no puede descargar dependencias de recompra experto m2 sobre la marcha, como detrás de un firewall o sin conexión a Internet, entonces también es necesario para empaquetar las dependencias utilizando maven-dependency-plugin a copiar todas las dependencias y maven-assembly-plugin para ensamblar dependencias

0

El artefacto producido en el proyecto Y solo contiene resultados de compilación en el proyecto Y, sin incluir sus dependencias.

Si desea construir un JAR en Y, que puede ejecutar directamente, puede considerar usar el plugin de ensamblaje.

Por ejemplo, la forma más fácil de construir un súper-jar para el proyecto de Y:

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.1</version> 
     <configuration> 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-all-in-one-jar</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
      ... 
</project> 

Aparte de un artefacto normal, un conjunto que contiene las clases, etc de las dependencias serán creados, que es adecuado para ser ejecutado por java -jar

visita http://maven.apache.org/plugins/maven-assembly-plugin/ para un uso más sofisticado.

0

Phil Sacre ya explicó bien el problema básico (básicamente, simplemente no hay información sobre dónde encontrar el X.jar incrustado en su Y.jar).

Además también se puede mirar en el appassembler-maven-plugin (que puede por ejemplo generar secuencias de comandos de lanzamiento para su proyecto Y que ya tiene el conjunto de ruta de clase derecha) y/o la exec-maven-plugin (que se puede utilizar para, por ejemplo, directamente lanzar Y con la ruta de clase derecha usando maven).

Cuestiones relacionadas