Ich versuche, im Rahmen eines schnellen Integrationstests eine Java-Befehlszeilen-App über Gradle auszuführen. Ich portiere meine Build-Skripte von Maven, wo dies einfach über möglich war exec-maven-plugin
. Meine zwei großen Anforderungen sind:
- In der Lage sein, Systemeigenschaften an den ausführbaren Java-Code zu übergeben
- Befehlszeilenargumente an den ausführbaren Java-Code übergeben können
Bitte beachten Sie, dass ich nicht versuche, diese Eigenschaften im Build-Skript zu lesen, sondern sie im Java-Programm zu lesen, das das Skript erstellt und ausführt.
Ich habe zwei weitere SO-Posts gefunden, die sich mit der Ausführung von Java-Programmen über Gradle befassen: einen mit einer Antwort, die die Verwendung apply plugin: "application"
in der Build-Datei und gradle run
in der Befehlszeile befürwortettask execute(type:JavaExec)
gradle execute
, und einen mit Antworten, die diesen Ansatz befürworten, sowie die Verwendung in der Build-Datei und im Befehlszeile . Ich habe beide Ansätze ausprobiert und es nicht geschafft.
Ich habe zwei Probleme:
(1) Ich kann die ausführbare Java-Datei nicht zum Lesen der Systemeigenschaften bringen
Ob ich das mache:
build.gradle :
apply plugin: 'application'
mainClassName = "com.mycompany.MyMain"
Befehlszeile :
gradle run -Dmyproperty=myvalue
Oder dieses:
build.gradle :
task execute (type:JavaExec) {
main = "com.mycompany.MyMain"
classpath = sourceSets.main.runtimeClasspath
}
Befehlszeile :
gradle execute -Dmyproperty=myvalue
In beiden Fällen myproperty
schafft es nicht durch. Der Code, der ab ausgeführt wird, MyMain.main (...)
liest die myproperty
Systemeigenschaft als null / fehlend.
(2) Ich kann keine Befehlszeilenargumente übergeben
Dies hängt wahrscheinlich mit dem ersten Problem zusammen. In exec-maven-plugin
zum Beispiel Befehlszeile args waren , sich in über eine Systemeigenschaft übergeben. Ist das bei Gradle der Fall oder gibt es eine andere Möglichkeit, Befehlszeilenargumente zu übergeben?
Wie komme ich durch diese Variablen? Auch ist es besser zu verwenden apply plugin: 'application'
oder task execute (type:JavaExec)
?