Maven: Jak uruchomić plik .java z wiersza poleceń, przekazując argumenty

88

Mam następujący problem. Chciałbym uruchomić plik mvnz wiersza poleceń Main.java. Main.javaakceptuje parametr. Jak to zrobić z wiersza poleceń?

Próbowałem znaleźć przykład, ale nie udało mi się. Czy ktoś mógłby mi pomóc, podając przykład?

Spojrzałem tutaj, ale nie do końca rozumiałem, co powinienem zrobić.

Ponadto, jak wykonać to polecenie z innego folderu niż folder Main.java?

na przykład Main.javaznajduje się w my/java/program/Main.java. Co mam włożyć

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
phedon rousou
źródło
4
Czego dokładnie nie zrozumiałeś z połączonego samouczka? To całkiem proste. Dodaj do swojego pytania kod, który próbowałeś do tej pory.
Percepcja
Zasadniczo próbuję wywołać klasę java z innej klasy java. Zwykle uruchamiam tę klasę z Eclipse. Używam Runtime.getRuntime (). Exec (""); aby wykonać tę klasę z innego programu Java. Ale Main.class potrzebuje do działania mvn. (Redagowałem pytanie)
phedon rousou

Odpowiedzi:

151

Można uruchomić: mvn exec:exec -Dexec.args="arg1".

Spowoduje to przekazanie argumentu arg1 do twojego programu.

Należy określić w pełni kwalifikowaną klasę główną, na przykład plik Main.java, który jest w pakiecie testowym, wymagałby

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

Używając -fparametru, jak opisano tutaj , można go również uruchomić z innych katalogów.

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

W przypadku wielu argumentów po prostu oddziel je spacją, tak jak w wierszu poleceń.

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

Argumenty oddzielone znakiem spacemożna grupować, używając 'argument separated with space' cudzysłowów.

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Behe
źródło
1
tak, ale skąd wie, gdzie znajduje się plik main.java?
phedon rousou
co jeśli nie mam pom.xml. Pojawia się następujący błąd Nie można wykonać mojo: java. Wymaga projektu z istniejącym pom.xml, ale kompilacja go nie używa.
phedon rousou
Projekt maven wymaga pliku pom.xml, bez tego pliku, używanie maven nie ma sensu. Więc może chcesz najpierw stworzyć projekt mavena? Wtedy wszystkie inne rozwiązania powinny działać dobrze.
Behe
Ponieważ używam Eclipse z wtyczką maven, myślałem, że została wygenerowana automatycznie, ale najwyraźniej się myliłem.
Przyjrzę
Jak przekazać argumenty zawierające spacje?
Vanuan
6

Oprócz uruchamiania go z mvn exec:java, możesz również uruchomić go zmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Benedikt Köppel
źródło
Gdzie umieścić argument Xmx w tym przypadku?
Fabich
1
Spróbuj umieścić to w -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel
Nie widzę, gdzie to będzie lepsze niż (IMO) proste podejście do exec: java
Neowizard
6

Dodanie skryptu powłoki np run.sh. Znacznie ułatwia to:

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

Następnie możesz wykonać:

./run.sh arg1 arg2 arg3
Tommy1005
źródło
To działa świetnie! Czy możesz wyjaśnić, dlaczego tak się nie dzieje: -Dexec.args = "$ @"
baumato
1
$@przechowuje wszystkie argumenty na liście ciągów znaków otoczonych cudzysłowami. Jeśli chcesz użyć go bezpośrednio, możesz użyć $*- wszystkich argumentów jako jednego ciągu. Próbowałeś tego?
Tommy1005