无法将Groovy库正确加载到执行脚本的Groovy Shell中

问题描述

我的软件使用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)可解决此问题。 因此问题出在编译上,而不是在执行上。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...