我正在尝试从远程位置加载2个Groovy脚本(例如S3)。第一个脚本很简单。它将包命名为a.b,文件本身称为c.dsl。
package a.b;
int i = 10;
public void anotherfunc() {};
private void anotheractivityFunc() { int k = 9;};
第二个groovy脚本中包含以下代码(名为s.dsl)
package c.d;
// Notice the import of the other script file here
import a.b.c;
int i = 10;
c myself;
public void func() {};
private void activityFunc()
{
int k = 9;
c nbn;
};
此脚本试图创建第一个脚本中定义的类的对象。我用这段代码贯穿了整个过程
CustomClassLoader loader = new CustomClassLoader(GroovyDSLTest.class.getClassLoader(), configuration);
GroovyShell shell = new GroovyShell(loader, configuration);
Script script = shell.parse(scriptText, "s.dsl");
CustomClassLoader是使用此函数定义的
public Class loadClass(name, ...)
{
try
{
return super.loadClass(name, lookupScriptFiles, preferClassOverScript, resolve);
}
catch (ClassNotFoundException e)
{
if (name.equals("a.b.c"))
// Notice how I handle the import a.b.c from the second groovy file
return parseClass(<text from c.dsl>, "c.dsl");
throw e;
}
}
执行此操作时出现编译错误。它将干净地加载a.b.c文件。但是,当我尝试将成员变量设置为“ c”时,它将失败。
s.dsl: 1: [Static type checking] - The variable [myself] is undeclared.
@ line 8, column 3.
c myself;
^
s.dsl: 1: [Static type checking] - Cannot find matching method c.d.s#c(java.lang.Object). Please check if the declared type is right and if the method exists.
@ line 8, column 1.
c myself;
^
为什么找不到c?我能够在加载类并且加载a.b.c时打印该类加载器。将上面的内容更改为使用a.b.c而不是仅使用“ c”也不起作用。 groovy从脚本文件生成的类的名称是什么。我希望能够访问此类并为其创建对象。
答案 0 :(得分:0)
如何使用@BaseScript
?
您可以创建要导入的类:
abstract class Something extends Script {
...
}
@BaseScript
可以帮助您导入它:@groovy.transform.BaseScript Something something
请参阅:http://docs.groovy-lang.org/2.5.2/html/gapi/groovy/transform/BaseScript.html
答案 1 :(得分:0)
Grrrr ...我想通了。
a)一个需要调用loadClass setClassCacheEntry();
b)命名类“ c”似乎也不起作用。我将其重命名为MyClass,它似乎可以工作