我想从我的摇篮构建脚本运行一个常规的命令行脚本。
我用我的摇篮脚本的代码:
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,所以它应该有它所需的一切。
由于该接受的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我要回答我的问题, 阅读 )
做到这一点的方法是如下:
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