使用GroovyShell从摇篮运行Groovy脚本:在线程异常“主要” java.lang.NoC

2019-07-04 17:05发布

我想从我的摇篮构建脚本运行一个常规的命令行脚本。

我用我的摇篮脚本的代码:

def groovyShell = new GroovyShell();
groovyShell.run(file('script.groovy'), ['arg1', 'arg2'] as String[])

事情做工精细,直到我的Groovy脚本(script.groovy)使用CliBuilder类。 然后我得到以下异常:

org.codehaus.groovy.runtime.InvokerInvocationException:java.lang.NoClassDefFoundError:组织/阿帕奇/公/ CLI / ParseException的...产生的原因:抛出java.lang.ClassNotFoundException:org.apache.commons.cli.ParseException

我发现很多人有类似的问题和错误,但“解决方案”很难从众多的帖子我看了提取。 很多人建议把公地CLI罐子在classpath中,但是这样做对于GroovyShell不是,我在所有明显。 另外,我已经宣布在script.groovy我需要的库@Grapes和@Grab,所以它应该有它所需的一切。

Answer 1:

由于该接受的SO回答 ,我终于找到了我需要做的:

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

您可以找到有关类加载器,为什么使用这种解决方案的详细信息在这个论坛上发帖 。

快乐的脚本!

(之前你downvote我要回答我的问题, 阅读 )



Answer 2:

做到这一点的方法是如下:

buildScript {
  repositories { mavenCentral() }
  dependencies {
    classpath "commons-cli:commons-cli:1.2"
  }
}

def groovyShell = new GroovyShell()
....

这给buildscript的classpath中而不是在项目的类路径中内置公地CLI依赖。



文章来源: Running Groovy script from Gradle using GroovyShell: Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
标签: groovy gradle