Maven: Cómo ejecutar un archivo .java desde la línea de comandos pasando argumentos

88

Tengo el siguiente problema. Me gustaría ejecutar mvndesde la línea de comandos para un Main.javaarchivo. Main.javaacepta un parámetro. ¿Cómo hago eso desde la línea de comandos?

Intenté encontrar un ejemplo pero no tuve éxito. ¿Alguien podría ayudarme dándome un ejemplo de eso?

Miré aquí pero no entendí muy bien qué debía hacer.

Además, ¿cómo ejecuto ese comando desde una carpeta diferente a la carpeta Main.java?

por ejemplo, Main.javase encuentra en my/java/program/Main.java. Que debo poner en

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
phedon rousou
fuente
4
¿Qué es exactamente lo que no entendiste del tutorial vinculado? Es bastante sencillo. Agregue a su pregunta el código que ha probado hasta ahora.
Percepción
Básicamente, lo que estoy tratando de hacer es llamar a una clase Java desde otra clase Java. Normalmente ejecuto esa clase desde Eclipse. Estoy usando Runtime.getRuntime (). Exec (""); para ejecutar esa clase desde otro programa java. Pero Main.class necesita mvn para ejecutarse. (Edité la pregunta)
phedon rousou

Respuestas:

151

Usted podría funcionar: mvn exec:exec -Dexec.args="arg1".

Esto pasará el argumento arg1 a su programa.

Debe especificar la clase principal completamente calificada, por ejemplo, un Main.java que está en una prueba de paquete necesitaría

mvn exec:java  -Dexec.mainClass=test.Main

Al usar el -fparámetro, como se describe aquí , también puede ejecutarlo desde otros directorios.

mvn exec:java -Dexec.mainClass=test.Main -f folder/pom.xm

Para varios argumentos, simplemente sepárelos con un espacio como lo haría en la línea de comandos.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="arg1 arg2 arg3"

Para los argumentos separados por a space, puede agrupar utilizando 'argument separated with space' entre comillas.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Behe
fuente
1
sí, pero ¿cómo sabe dónde se encuentra el archivo main.java?
phedon rousou
¿qué pasa si no tengo el pom.xml. Recibo el siguiente error No se puede ejecutar mojo: java. Requiere un proyecto con un pom.xml existente, pero la compilación no usa uno.
phedon rousou
Un proyecto de maven requiere un pom.xml, sin este archivo, el uso de maven tiene poco sentido. Entonces, ¿quizás quieras crear un proyecto experto primero? Entonces todas las otras soluciones deberían funcionar bien.
Behe
Debido a que uso Eclipse con el complemento maven, pensé que se generaba automáticamente, pero aparentemente estaba equivocado. Lo
echaré
¿Cómo pasar argumentos que contienen espacios?
Vanuan
6

Además de ejecutarlo con mvn exec:java, también puede ejecutarlo conmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Benedikt Köppel
fuente
¿Dónde pondría el argumento Xmx en este caso?
Fabich
1
Intente ponerlo en -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel
No veo dónde esto será mejor que el enfoque directo (IMO) de exec: java
Neowizard
6

Agregar un script de shell, por ejemplo, lo run.shhace mucho más fácil:

#!/usr/bin/env bash
export JAVA_PROGRAM_ARGS=`echo "$@"`
mvn exec:java -Dexec.mainClass="test.Main" -Dexec.args="$JAVA_PROGRAM_ARGS"

Entonces puedes ejecutar:

./run.sh arg1 arg2 arg3
Tommy1005
fuente
¡Esto funciona muy bien! ¿Puede explicar por qué esto no: -Dexec.args = "$ @"
baumato
1
$@almacena todos los argumentos en una lista de cadenas entre comillas. Si desea usarlo directamente, puede usar $*todos los argumentos como una sola cadena. ¿Intentaste esto?
Tommy1005