从其他脚本动态导入groovy脚本

时间:2018-09-28 06:23:04

标签: groovy

我正在尝试从远程位置加载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从脚本文件生成的类的名称是什么。我希望能够访问此类并为其创建对象。

2 个答案:

答案 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,它似乎可以工作