【发布时间】:2021-01-16 05:00:42
【问题描述】:
我的软件使用 groovy.lang Java 包从 shell 执行 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 库 我的偏好是实现一个类(在现有脚本中添加行似乎是一种 hack)。
我做了一个简单的类来表示库代码。现在,它看起来像:
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 库。
最大
【问题讨论】:
-
我认为您的方法没有任何问题。我尝试了您描述的方式,它按预期工作。您能否提供失败的脚本?
标签: java groovy groovyshell