繁体   English   中英

未能将 Groovy 库正确加载到 Groovy shell 执行脚本中

[英]Failure to load properly Groovy library into Groovy shell executing script

我的软件使用 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 库我的偏好是实现一个类(在现有脚本中添加行似乎是一种黑客行为)。

我做了一个简单的类来表示库代码。 现在,它看起来像:

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 库的任何提示。

最大限度

感谢您的评论。 我想我明白原因了。 事实证明,在某些时候,“脚本”正在使用

GroovyClassLoader classLoader = new GroovyClassLoader(parentClassLoader);
GroovyCodeSource codeSource = new GroovyCodeSource(code, scriptClassName + ".groovy", "/groovy/script");
CompilationUnit cu = new CompilationUnit(classLoader);
cu.addSource(codeSource.getName(), codeSource.getScriptText());
cu.compile(CompilePhase.CLASS_GENERATION.getPhaseNumber());

到达“import”语句时编译失败,因为库类不在类路径中,因此无法访问。

使用适当的路径调用classLoader.addClasspath(path)可以解决该问题。 所以问题与编译有关 - 与执行无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM