Estoy intentando ejecutar una aplicación Java de línea de comandos a través de Gradle como parte de una prueba de integración rápida. Estoy portando mis scripts de compilación desde Maven, donde esto se hizo fácilmente a través de exec-maven-plugin
. Mis dos grandes requisitos son:
- Ser capaz de pasar propiedades del sistema al código ejecutable de Java.
- Ser capaz de pasar argumentos de línea de comandos al código ejecutable de Java
Tenga en cuenta que no estoy tratando de leer estas propiedades en el script de compilación, estoy tratando de leerlas en el programa Java que el script construye y ejecuta.
Encontré otras dos publicaciones SO que abordan la ejecución del programa Java a través de Gradle: una con una respuesta que aboga por el uso apply plugin: "application"
en el archivo de compilación y gradle run
en la línea de comando , y otra con respuestas que abogan por ese enfoque, así como task execute(type:JavaExec)
en el archivo de compilación y gradle execute
en el línea de comando . He probado ambos enfoques y no he tenido éxito.
Tengo dos problemas:
(1) No puedo hacer que el ejecutable de Java lea las propiedades del sistema
Si hago esto:
build.gradle :
apply plugin: 'application'
mainClassName = "com.mycompany.MyMain"
Línea de comando :
gradle run -Dmyproperty=myvalue
O esto:
build.gradle :
task execute (type:JavaExec) {
main = "com.mycompany.MyMain"
classpath = sourceSets.main.runtimeClasspath
}
Línea de comando :
gradle execute -Dmyproperty=myvalue
En cualquier caso, myproperty
no lo logra. El código que comienza a ejecutarse MyMain.main (...)
lee la myproperty
propiedad del sistema como nulo / perdido.
(2) No puedo pasar argumentos de línea de comando
Probablemente esto esté relacionado con el primer problema. En exec-maven-plugin
, por ejemplo, los argumentos de la línea de comandos se pasaban a través de una propiedad del sistema. ¿Es ese el caso de Gradle o hay otra forma de pasar argumentos de línea de comando?
¿Cómo hago pasar estas variables? Además, ¿es mejor usar apply plugin: 'application'
o task execute (type:JavaExec)
?
systemProperty "myvariable", "${myvariable}"
-Dexec.args="--greeting 'hello there'"
, no funcionará, es necesario establecer otro delimitador.Para aquellos que no quieran contaminar las propiedades del sistema de su aplicación al pasar accesorios de Gradle no relacionados, recomiendo espaciar sus argumentos.
tasks.withType(JavaExec) { System.properties.each { k,v-> if (k.startsWith("prefix.")) { systemProperty k - "prefix.", v } } }
java ... -Dprefix.my.prop=true
pasarámy.prop
fuente
Soy nuevo en gradle, así que necesitaba esto y lo que me funciona con gradle 4.6 parece un poco más fácil para la línea de comandos. En lugar de analizar una cadena de argumentos, puede pasar una matriz de argumentos, y encontré una manera de pasar todas las propiedades con una línea también. Combinado a continuación:
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=
fuente
Tal vez llego tarde a la fiesta, pero ¿alguien ha intentado "configurar el accesorio antes de ejecutar gradle"? Lo he probado y esto también funciona, aparentemente.
Por ejemplo, puede configurar el perfil activo como:
Estos también funcionan, aparentemente: (probado)
set myVar=myVal && gradle test # for windows export myVar=myVal && gradle test # for linux and mac
Tenga cuidado de que
myVar
no se puedan separar períodos; o de lo contrario, solo se tomará como clave la parte anterior al primer período.fuente