更新时间:2023-12-05 15:09:28
感谢这个不被接受的SO答案,我终于找到了我需要做的事情:
//定义我们自己的配置
配置{
addToClassLoader
}
//列出我们的shell脚本在他们的classLoader中需要的依赖关系:
dependencies {
addToClassLoader组:'commons-cli',name :'commons-cli',版本:'1.2'
}
//现在将这些依赖关系添加到根classLoader:
URLClassLoader loader = GroovyObject.class.classLoader
配置。 addToClassLoader.each {文件文件 - >
loader.addURL(file.toURL())
}
//现在没有更多的异常了:
def groovyShell = new GroovyShell() ;
groovyShell.run(file('script.groovy'),['arg1','arg2'] as String [])
你可以找到关于classLoaders的更多细节,以及为什么这个解决方案能够工作在此论坛帖子中。
快乐脚本!
(在你回答我自己的问题之前,我赞同我的意见,)
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();
groovyShell.run(file('script.groovy'), ['arg1', 'arg2'] as String[])
Things work fine until my Groovy script (script.groovy) uses the CliBuilder class. Then I get the following exception:
org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException ... Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
I found lots of people with similar problems and errors, but "the solution" was difficult to extract from the numerous posts I read. Lots of people suggested putting the commons-cli jar on the classpath, but doing so for the GroovyShell was not at all apparent to me. Also, I had already declared @Grapes and @Grab for my required libraries in the script.groovy, so it should have everything it needed.
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)