【问题标题】:Failure to load properly Groovy library into Groovy shell executing script未能将 Groovy 库正确加载到 Groovy shell 执行脚本中
【发布时间】: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


【解决方案1】:

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

编译
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) 可以解决问题。 所以问题与编译有关 - 而不是执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2012-02-18
    • 2013-11-06
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多