Maven: come eseguire un file .java dalla riga di comando passando argomenti


88

Ho il seguente problema. Vorrei eseguire mvndalla riga di comando per un Main.javafile. Main.javaaccetta un parametro. Come posso farlo dalla riga di comando?

Ho provato a trovare un esempio ma non ci sono riuscito. Qualcuno potrebbe aiutarmi dandomi un esempio di questo?

Ho guardato qui ma non ho capito bene cosa avrei dovuto fare.

Inoltre, come faccio a eseguire quel comando da una cartella diversa dalla cartella Main.java?

ad esempio il Main.javasi trova in my/java/program/Main.java. Cosa dovrei inserire

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"

4
Che cosa non hai capito esattamente dal tutorial collegato? È piuttosto semplice. Per favore aggiungi alla tua domanda il codice che hai provato finora.
Perception

Fondamentalmente quello che sto cercando di fare è chiamare una classe Java da un'altra classe Java. Normalmente gestisco quella classe da Eclipse. Sto usando Runtime.getRuntime (). Exec (""); per eseguire quella classe da un altro programma java. Ma Main.class necessita di mvn per funzionare. (Ho modificato la domanda)
phedon rousou

Risposte:


151

Si potrebbe eseguire: mvn exec:exec -Dexec.args="arg1".

Questo passerà l'argomento arg1 al tuo programma.

È necessario specificare la classe principale completamente qualificata, ad esempio, un Main.java che si trova in un test del pacchetto avrebbe bisogno

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

Utilizzando il -fparametro, come descritto qui , è possibile eseguirlo anche da altre directory.

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

Per più argomenti, separali semplicemente con uno spazio come faresti sulla riga di comando.

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

Per gli argomenti separati da una space, puoi raggruppare usando 'argument separated with space' tra virgolette.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"

1
si, ma come fa a sapere dove si trova il file main.java?
phedon rousou

cosa succede se non ho il pom.xml. Ottengo il seguente errore Impossibile eseguire mojo: java. Richiede un progetto con un pom.xml esistente, ma la build non ne utilizza uno.
phedon rousou

Un progetto Maven richiede un pom.xml, senza questo file, usare Maven non ha molto senso. Quindi, forse vuoi creare prima un progetto esperto? Quindi tutte le altre soluzioni dovrebbero funzionare bene.
Behe

Dato che uso Eclipse con il plugin Maven ho pensato che fosse generato automaticamente ma a quanto pare mi sbagliavo. Lo esaminerò
phedon rousou

Come passare argomenti che contengono spazi?
Vanuan

6

Oltre a eseguirlo con mvn exec:java, puoi anche eseguirlo conmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"

Dove metterei l'argomento Xmx in questo caso?
Fabich

1
Prova a metterlo in -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel

Non vedo dove sarà migliore dell'approccio diretto (IMO) di exec: java
Neowizard

6

L'aggiunta di uno script di shell, ad esempio run.sh, lo rende molto più semplice:

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

Quindi sei in grado di eseguire:

./run.sh arg1 arg2 arg3

Funziona alla grande! Puoi spiegare perché questo non funziona: -Dexec.args = "$ @"
baumato

1
$@memorizza tutti gli argomenti in un elenco di stringhe racchiuse tra virgolette. Se vuoi usarlo direttamente puoi usare $*- tutti gli argomenti come una singola stringa. Hai provato questo?
Tommy1005
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.