Maven: So führen Sie eine Java-Datei über die Befehlszeile aus und übergeben Argumente

87

Ich habe folgendes Problem. Ich möchte mvnfür eine Main.javaDatei von der Kommandozeile aus ausführen . Main.javaakzeptiert einen Parameter. Wie mache ich das über die Kommandozeile?

Ich habe versucht, ein Beispiel zu finden, war aber nicht erfolgreich. Könnte mir jemand helfen, indem er mir ein Beispiel dafür gibt?

Ich habe hier gesucht , aber nicht ganz verstanden, was ich tun soll.

Auch , wie führe ich diesen Befehl aus einem anderen Ordner als dem Main.java Ordner?

Zum Beispiel Main.javabefindet sich das in my/java/program/Main.java. Was soll ich eingeben

mvn exec:java -Dexec.mainClass="what to put here?" -Dexec.args="arg0 arg1 arg2"
Phedon Rousou
quelle
4
Was genau haben Sie aus dem verlinkten Tutorial nicht verstanden? Es ist ziemlich einfach. Bitte fügen Sie Ihrer Frage den Code hinzu, den Sie bisher ausprobiert haben.
Wahrnehmung
Grundsätzlich versuche ich, eine Java-Klasse aus einer anderen Java-Klasse aufzurufen. Normalerweise führe ich diese Klasse von Eclipse aus. Ich verwende Runtime.getRuntime (). Exec (""); um diese Klasse von einem anderen Java-Programm auszuführen. Aber Main.class benötigt mvn, um ausgeführt zu werden. (Ich habe die Frage bearbeitet)
Phedon Rousou

Antworten:

146

Sie könnten laufen : mvn exec:exec -Dexec.args="arg1".

Dadurch wird das Argument arg1 an Ihr Programm übergeben.

Sie sollten die Hauptklasse angeben, die vollständig qualifiziert ist, z. B. eine Main.java, die sich in einem Pakettest befindet

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

Durch die Verwendung von -fParametern, wie beschrieben hier , können Sie es auch aus anderen Verzeichnissen laufen.

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

Trennen Sie mehrere Argumente einfach wie in der Befehlszeile durch ein Leerzeichen.

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

Für Argumente, die durch a getrennt sind space, können Sie sie 'argument separated with space' innerhalb der Anführungszeichen gruppieren .

mvn exec:java -Dexec.mainClass=test.Main -Dexec.args="'argument separated with space' 'another one'"
Behe
quelle
Ja, aber woher weiß es, wo sich die Datei main.java befindet?
Phedon Rousou
Was ist, wenn ich die pom.xml nicht habe? Ich erhalte die folgende Fehlermeldung Mojo kann nicht ausgeführt werden: Java. Es erfordert ein Projekt mit einer vorhandenen pom.xml, aber der Build verwendet keine.
Phedon Rousou
Für ein Maven-Projekt ist eine pom.xml erforderlich. Ohne diese Datei ist die Verwendung von Maven wenig sinnvoll. Vielleicht möchten Sie zuerst ein Maven-Projekt erstellen? Dann sollten alle anderen Lösungen gut funktionieren.
Behe
Da ich Eclipse mit dem Maven-Plugin verwende, dachte ich, dass es automatisch generiert wurde, aber anscheinend habe ich mich geirrt. Ich werde einen Blick darauf
werfen
Wie übergebe ich Argumente, die Leerzeichen enthalten?
Vanuan
6

Darüber hinaus es läuft mit mvn exec:java, können Sie führen Sie es auch mitmvn exec:exec

mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath your.package.MainClass"
Benedikt Köppel
quelle
Wo würde ich in diesem Fall das Xmx-Argument platzieren?
Fabich
1
Versuchen Sie es in -Dexec.args:mvn exec:exec -Dexec.executable="java" -Dexec.args="-Xmx4g -classpath %classpath your.package.MainClass"
Benedikt Köppel
Ich sehe nicht, wo dies besser sein wird als der (IMO) direkte Ansatz von exec: java
Neowizard
5

Das Hinzufügen eines Shell-Skripts run.shmacht es beispielsweise viel einfacher:

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

Dann können Sie Folgendes ausführen:

./run.sh arg1 arg2 arg3
Tommy1005
quelle
Das funktioniert super! Können Sie erklären, warum dies nicht der Fall ist: -Dexec.args = "$ @"
baumato
1
$@speichert alle Argumente in einer Liste von Zeichenfolgen in Anführungszeichen. Wenn Sie es direkt verwenden möchten, können Sie $*- alle Argumente als einzelne Zeichenfolge verwenden. Hast du das versucht?
Tommy1005