динамический импорт скриптов из других скриптов - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь загрузить 2 отличных скрипта из удаленного местоположения (скажем, S3).Первый сценарий прост.Он называет пакет ab, а сам файл называется 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;
    }
}

Я получаю ошибку компиляции, когда я делаю это.Он загружает файл abc чисто.Но когда я пытаюсь создать переменную-член "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?Я смог напечатать загрузчик классов, так как он загружает классы, и он загрузил abc. Изменение вышеприведенного кода на использование abc вместо простого «c» также не работает.Как называется класс, который groovy генерирует из файла сценария.Я хочу иметь доступ к этому классу и создавать его объекты.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Грррр ... Я понял это.

a) необходимо вызвать в loadClass setClassCacheEntry ();

b) Также не возможно присвоение имени классу "c".Я переименовал его в MyClass, и он, кажется, работает

0 голосов
/ 28 сентября 2018

Как насчет использования @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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...