问题描述
我的软件使用groovy.lang Java程序包从外壳执行Groovy脚本,将脚本中的变量绑定到Java对象。
典型的脚本如下:
package packagename
// import Java classes
abstract class MyClass extends Script {
def myfunction() {
}
}
在此示例中,将从外部调用“ myfunction”。
按以下顺序从Java加载脚本(位于文件系统中)- 该代码返回groovyshell类实例:
GroovyClassLoader groovyClassLoader = new GroovyClassLoader(...)
File groovyFile = new File(groovyURL.toURI());
Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
CompilerConfiguration groovyConfig = new CompilerConfiguration();
groovyConfig.setScriptBaseClass(groovyClass.getName());
return new groovyshell(groovyClassLoader,new Binding(),groovyConfig);
我的设计目标是添加一个可以在脚本之间共享的Groovy库 我更喜欢实现一个类(将行添加到现有脚本中似乎是一种技巧)。
package shared
class MySharedLib
{
static def testFunction()
{
return "test";
}
}
groovyClassLoader.parseClass(groovyLibraryFile)
在通过以下方式加载实际脚本之前:
groovyClassLoader.parseClass(groovyFile);
现在,从脚本中,我可以调用该库:
shared.MySharedLib.testFunction()
实际上返回字符串“ test”。
但是,当尝试通过以下方式进行导入时:
import shared.MySharedLib
Exception in thread "main" org.codehaus.groovy.control.MultipleCompilationErrorsException: startup Failed:
script754084858.groovy: 14: unable to resolve class shared.MySharedLib
@ line 14,column 1.
试图修改类路径,但没有帮助。我意识到我的设置有问题。 将不胜感激任何技巧,介绍如何以正确的方式加载Groovy库。
最大
解决方法
感谢评论。 我想我明白原因。 事实证明,在某些时候,“脚本”正在使用
进行编译<svg>
<defs>
<clipPath id="cut-off-top">
<rect x="0%" y="0%" width="100%" height="100%"/>
</clipPath>
<clipPath id="cut-off-bottom">
<rect x="0%" y="50%" width="100%" height="100%"/>
</clipPath>
</defs>
<circle id="semi-circle1" cx="50%" cy="50%" r="50%" fill="red" clip-path="url(#cut-off-top)" />
<circle id="semi-circle2" cx="50%" cy="50%" r="50%" fill="orange" clip-path="url(#cut-off-bottom)" />
</svg>
由于库类不在类路径中,因此到达“ import”语句时编译失败。
使用适当的路径调用 classLoader.addClasspath(path)可解决此问题。 因此问题出在编译上,而不是在执行上。