Próbuję uruchomić aplikację Java z wiersza poleceń za pośrednictwem Gradle w ramach szybkiego testu integracji. Przenoszę moje skrypty budowania z Mavena, gdzie można to łatwo zrobić za pośrednictwem exec-maven-plugin
. Moje dwa duże wymagania to:
- Możliwość przekazywania właściwości systemowych do wykonywalnego kodu Java
- Możliwość przekazywania argumentów wiersza poleceń do wykonywalnego kodu Java
Zwróć uwagę, że nie próbuję odczytać tych właściwości w skrypcie kompilacji, próbuję je odczytać w programie Java, który ten skrypt buduje i wykonuje.
Znalazłem dwa inne stanowiska, tak aby adres Java wykonanie programu przez Gradle: jeden z odpowiedzią, że zwolennicy używając apply plugin: "application"
w pliku kompilacji i gradle run
w wierszu polecenia , a inna z odpowiedzi promując takie podejście, jak również korzystania task execute(type:JavaExec)
z pliku kompilacji i gradle execute
u wiersz poleceń . Próbowałem obu podejść i nie udało mi się.
Mam dwa problemy:
(1) Nie mogę pobrać pliku wykonywalnego Java do odczytu właściwości systemu
Czy to robię:
build.gradle :
apply plugin: 'application'
mainClassName = "com.mycompany.MyMain"
Wiersz poleceń :
gradle run -Dmyproperty=myvalue
Albo to:
build.gradle :
task execute (type:JavaExec) {
main = "com.mycompany.MyMain"
classpath = sourceSets.main.runtimeClasspath
}
Wiersz poleceń :
gradle execute -Dmyproperty=myvalue
W obu przypadkach myproperty
nie przechodzi. Kod rozpoczynający się od MyMain.main (...)
odczytuje myproperty
właściwość systemową jako null / brakującą.
(2) Nie mogę przekazać argumentów wiersza poleceń
Jest to prawdopodobnie związane z pierwszym problemem. Na exec-maven-plugin
przykład same argumenty wiersza poleceń były przekazywane przez właściwość systemową. Czy tak jest w przypadku Gradle, czy jest inny sposób przekazywania argumentów wiersza poleceń?
Jak uzyskać dostęp do tych zmiennych? Czy lepiej jest użyć apply plugin: 'application'
lub task execute (type:JavaExec)
?
systemProperty "myvariable", "${myvariable}"
-Dexec.args="--greeting 'hello there'"
- nie zadziała, trzeba ustawić inny separator.Dla tych, którzy mogą nie chcieć zanieczyszczać właściwości systemowych aplikacji przez przekazywanie niepowiązanych właściwości Gradle, polecam umieszczanie argumentów w przestrzeni nazw.
tasks.withType(JavaExec) { System.properties.each { k,v-> if (k.startsWith("prefix.")) { systemProperty k - "prefix.", v } } }
java ... -Dprefix.my.prop=true
przejdziemy.prop
źródło
Jestem nowy w gradle, więc potrzebowałem tego i to, co działa dla mnie w gradle 4.6, wydaje się trochę łatwiejsze w linii poleceń. Zamiast analizować 1 ciąg arg, możesz przekazać tablicę argumentów, a ja znalazłem sposób na przekazanie całej właściwości również w jednej linii. Połączone poniżej:
apply plugin: 'java' apply plugin: 'org.springframework.boot' <- for my project task runApp(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'testit.TomcatApp' // arguments to pass to the application // args 'myarg1 -rest' <- came in as 1 string args = ["--myarg1 with spaces even", "--myarg2"] // and to pass in all -D system property args: systemProperties = System.properties } gradle run -Dwhatever=xxx -Dmyarg2=hey // Java reading them: public static void main(String[] args) { for ( int i = 0; i < args.length; i++ ) { logger.info( "** args [" + i + "] =" + args[i] + "=" ); } logger.info( "** -Dwhatever =" + System.getProperty("whatever") + "=" ); logger.info( "** -Dmyarg2 =" + System.getProperty("myarg2") + "=" ); [main] INFO testit.TomcatApp - ** args [0] =--myarg1 with spaces even= [main] INFO testit.TomcatApp - ** args [1] =--myarg2= [main] INFO testit.TomcatApp - ** -Dwhatever =xxx= [main] INFO testit.TomcatApp - ** -Dmyarg2 =hey=
źródło
Może spóźniłem się na przyjęcie, ale czy ktoś próbował „ustawić rekwizyt przed wykonaniem gradle”? Testowałem i najwyraźniej to też działa.
Na przykład możesz ustawić aktywny profil, taki jak:
Te też najwyraźniej działają: (przetestowane)
set myVar=myVal && gradle test # for windows export myVar=myVal && gradle test # for linux and mac
Uważaj, ponieważ
myVar
nie można oddzielić kropek; w przeciwnym razie tylko część przed pierwszą kropką będzie brana za klucz.źródło