deploy - plugin de groovy para smart tv
Ejecutar script de Groovy desde Gradle usando GroovyShell: Excepción en el hilo "principal" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException (2)
La alternativa para hacer esto es lo siguiente:
buildScript {
repositories { mavenCentral() }
dependencies {
classpath "commons-cli:commons-cli:1.2"
}
}
def groovyShell = new GroovyShell()
....
Esto pone la dependencia commons-cli en classpath del buildscript en lugar de la classpath del proyecto que se construirá.
Quiero ejecutar un script groovy de línea de comandos de mi script de construcción de Gradle.
Estoy usando este código en mi script de Gradle:
def groovyShell = new GroovyShell();
groovyShell.run(file(''script.groovy''), [''arg1'', ''arg2''] as String[])
Las cosas funcionan bien hasta que mi script de Groovy (script.groovy) usa la clase CliBuilder. Luego recibo la siguiente excepción:
org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.NoClassDefFoundError: org / apache / commons / cli / ParseException ... Causado por: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
Encontré mucha gente con problemas y errores similares, pero "la solución" fue difícil de extraer de las numerosas publicaciones que leí. Mucha gente sugirió poner commons-cli jar en classpath, pero hacerlo para GroovyShell no fue del todo evidente para mí. Además, ya había declarado @Grapes y @Grab para las bibliotecas necesarias en script.groovy, por lo que debería tener todo lo que necesitara.
Gracias a esta respuesta SO no aceptada , finalmente encontré lo que necesitaba hacer:
//define our own configuration
configurations{
addToClassLoader
}
//List the dependencies that our shell scripts will require in their classLoader:
dependencies {
addToClassLoader group: ''commons-cli'', name: ''commons-cli'', version: ''1.2''
}
//Now add those dependencies to the root classLoader:
URLClassLoader loader = GroovyObject.class.classLoader
configurations.addToClassLoader.each {File file ->
loader.addURL(file.toURL())
}
//And now no more exception when I run this:
def groovyShell = new GroovyShell();
groovyShell.run(file(''script.groovy''), [''arg1'', ''arg2''] as String[])
Puede encontrar más detalles sobre classLoaders y por qué esta solución funciona en esta publicación del foro .
Happy scripting!
(Antes de que me voten por contestar mi propia pregunta, lea esto )