Running Groovy script from Gradle using GroovyShell: Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException

后端 未结 2 939
终归单人心
终归单人心 2021-01-05 14:59

I want to run a groovy command-line script from my Gradle build script.

I\'m using this code in my Gradle script:

def groovyShell = new GroovyShell(         


        
相关标签:
2条回答
  • 2021-01-05 15:35

    The alternative to do this is the following:

    buildScript {
      repositories { mavenCentral() }
      dependencies {
        classpath "commons-cli:commons-cli:1.2"
      }
    }
    
    def groovyShell = new GroovyShell()
    ....
    

    This puts the commons-cli dependency on the classpath of the buildscript instead of on the classpath of the project to be built.

    0 讨论(0)
  • 2021-01-05 16:01

    Thanks to this unaccepted SO answer, I finally found what I needed to do:

    //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[])
    

    You can find more details about classLoaders and why this solution works in this forum post.

    Happy scripting!

    (Before you downvote me for answering my own question, read this)

    0 讨论(0)
提交回复
热议问题