2011-05-16 29 views
10

Soy nuevo en Java y en Maven, por lo que es muy simple.¿Cómo puedo empaquetar y ejecutar una aplicación de línea de comandos simple con dependencias usando maven?

Si sigo el maven2 hello world instrucciones aquí:

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

todo funciona bien. Si luego modifico pom.xml para generar una dependencia desde un repositorio remoto, los archivos de esta dependencia se almacenan en ~/.m2/repository/new-dependency/.

Uso de la sintaxis en los hello world instrucciones para ejecutar la aplicación requiere que añado la ruta absoluta a la dependencia a mi ruta de clases (ya sea estableciendo la variable de entorno o mediante el modificador de línea de comandos):

java -cp target/my-app-1.0-SNAPSHOT.jar:/.../.m2/.../new-dependency.jar com.mycompany.app.App 

Obviamente, esto se volverá difícil de manejar rápidamente :)

Sospecho que esta no es la forma habitual de ejecutar un programa Java y que solo necesito leer más acerca de los archivos .jar, pero mientras lo hago, agradecería cualquier consejo. sobre cómo hacer esto correctamente

No estoy usando un IDE, por cierto. vim desde la línea de comando.

Gracias!

Mike.

Respuesta

9

Puede hacer un jar ejecutable agregando el atributo de clase principal a su archivo de manifiesto. En Maven, esto se hace mediante el complemento del archivador. Para añadir el atributo de la clase principal, agregar esto a su pom.xml:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId>   
     <configuration> 
     <archive> 
      <manifest> 
      <addClasspath>true</addClasspath> 
      <mainClass>com.mycompany.app.App</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

Ahora puede ejecutar el frasco con el comando: java -jar myjar.jar o haciendo doble clic sobre él (no disponible en todas las plataformas).

+0

Esto funciona después de un poco de modificación: – mdtsandman

+2

Para hacer que esta solución funcione, necesitaba agregar classpathMavenRepositoryLayout = true y classpathPrefix =/home /.../. M2/repository/a la sección de manifiesto también porque el comportamiento predeterminado es simplemente poner el nombre del jar en el manifiesto (sin referencia a su ubicación en el sistema de archivos). – mdtsandman

+0

Sí, el comportamiento predeterminado espera que las dependencias estén en el mismo directorio de su jar principal. Como tiene dependencias en su repositorio local, con su solución, el jar puede ejecutarse desde cualquier lugar de su sistema. – iruediger

12

Puede usar maven para ejecutarlo, creo que establece el classpath para usted.

mvn compile 

lo compilará entonces se corre:

mvn exec:java -Dexec.mainClass="com.mycompany.app.App" 

que ejecutarlo.

Se puede ver http://www.vineetmanohar.com/2009/11/3-ways-to-run-java-main-from-maven/ de algo más de información sobre las formas de funcionamiento (incluyendo pasar argumentos de línea de comandos a la cosa que desea ejecutar)

+0

Esto también funciona bien.Gracias en particular por el enlace! – mdtsandman

2

Puede usar el maven-shade-plugin que creará una guerra súper ejecutable con todas las dependencias.

O

Uso del appassembler-plugin que crea un script que importa todas las dependencias y le permite ejecutar una clase principal desde la línea de comandos.

+0

No probé el plugin de sombra, pero appassembler funciona para mí. ¡Gracias! – mdtsandman

Cuestiones relacionadas