Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Встраивание groovy / 15 сообщений из 15, страница 1 из 1
12.07.2021, 15:46
    #40083396
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
Понадобилось мне в java проект встроить использование расширений, которые будут писаться сторонними разработчиками и подкладываться в виде исходников. умные люди посоветовали использовать груви. Эти же самые умные люди сказали, что есть возможность в своём проекте написать класс с полезными функциями и при подключение груви класса устанавливать свой класс в качестве базового, чтобы в груви коде были доступны всякие полезности. После этого умный человек ушёл в отпуск и уехал отдыхать.
А я что то туплю и никак не нагуглю, как это сделать правильно.
Подскажите пожалуйста - действительно ли есть такая возможность и если есть - как это сделать?
...
Рейтинг: 0 / 0
12.07.2021, 16:52
    #40083402
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
xerxf,

см. GroovyScript - можно прокидывать переменные/использовать свои классы и т.п.
...
Рейтинг: 0 / 0
12.07.2021, 17:08
    #40083408
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
А в какой момент времени эти "сторонние люди" будут подкладывать расширения?
В компилляции? В рантайме? Или перед запуском бинарника?
...
Рейтинг: 0 / 0
12.07.2021, 17:14
    #40083411
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
SpringMan,

Смотрел. Параметры пробрасываются без проблем. Забираются тоже. Методы из груви тоже запускаются.
Базовый класс установить не получается
Я полагал, должно быть что то вроде

CompilerConfiguration conf = new CompilerConfiguration();
conf.setScriptBaseClass(BaseClass.class.getName());
GroovyShell shell = new GroovyShell(getClass().getClassLoader(), new Binding(), conf);
где BaseClass - класс из проекта. Мне хотелось бы, чтобы после этого подгруженные классы наследовали методы моего BaseClass. Что то то ли я что то упускаю, то ли это в принципе делается не так
...
Рейтинг: 0 / 0
12.07.2021, 17:15
    #40083412
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
mayton
А в какой момент времени эти "сторонние люди" будут подкладывать расширения?
В компилляции? В рантайме? Или перед запуском бинарника?


В рантайме. Иначе зачем городить огород с подгрузкой исходников?
...
Рейтинг: 0 / 0
12.07.2021, 17:27
    #40083415
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
Покажи код, не совсем понимаю в чем проблема. К примеру с таким baseClass-ом:
Код: java
1.
2.
3.
4.
5.
public abstract class AbstractGroovyScript extends groovy.lang.Script {
    public String getValue() {
        return "im parent";
    }
}


внутри скрипта можно вызывать getValue()
...
Рейтинг: 0 / 0
12.07.2021, 17:33
    #40083418
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
Можно просто использовать классы из класслоадера. Не обязательно вообще использовать baseClass - можно импортануть нужное внутри руками
...
Рейтинг: 0 / 0
12.07.2021, 18:06
    #40083423
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
SpringMan
Покажи код, не совсем понимаю в чем проблема. К примеру с таким baseClass-ом:
Код: java
1.
2.
3.
4.
5.
public abstract class AbstractGroovyScript extends groovy.lang.Script {
    public String getValue() {
        return "im parent";
    }
}


внутри скрипта можно вызывать getValue()


Базовый класс
public abstract class BaseClass extends Script {
public String getValue() {
return "im parent";
}
}

Подгружаемый класс
class Test extends Script{
def params;

Object run() {
return getValue()
}
}

код


CompilerConfiguration conf = new CompilerConfiguration();
conf.setScriptBaseClass(BaseClass.class.getName());
GroovyShell shell = new GroovyShell(getClass().getClassLoader(), new Binding(), conf);
Script script = null;
try {
script = shell.parse(new File("test.groovy"));
} catch (IOException e) {
e.printStackTrace();
}
script.run();

вывод

groovy.lang.MissingMethodException: No signature of method: Test.getValue() is applicable for argument types: () values: []
Possible solutions: getClass(), evaluate(java.io.File), evaluate(java.lang.String), getAt(java.lang.String), getParams()
...
Рейтинг: 0 / 0
12.07.2021, 18:12
    #40083424
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
SpringMan
Можно просто использовать классы из класслоадера. Не обязательно вообще использовать baseClass - можно импортануть нужное внутри руками

имеется ввиду внутри подгружаемого скрипта? динамически подгружать классы ? не хотелось бы. предполагается, что то будет некое ядро, которое разные команды будут расширять под свои нужды - сказать, что вы вот можете подкладывать сюда скрипты, которым будет доступен такой то функционал - гораздо лучше, чем сказать, что вы можете класлоадером грузить классы и у вас наступит щастье
...
Рейтинг: 0 / 0
12.07.2021, 18:21
    #40083428
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
xerxf,

почему Test extends Script ?

если ты объявляешь класс - то все следует правилам джавы и setScriptBaseClass не используется

если ты работаешь со скриптом (нет объявления класса) то будет использоваться setScriptBaseClass

т.е. с твоим бейз классом подгружаемый скрипт типа


Код: java
1.
return getValue()



должен работать
...
Рейтинг: 0 / 0
12.07.2021, 18:27
    #40083430
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
Dmitry.
xerxf,

почему Test extends Script ?

если ты объявляешь класс - то все следует правилам джавы и setScriptBaseClass не используется

если ты работаешь со скриптом (нет объявления класса) то будет использоваться setScriptBaseClass

т.е. с твоим бейз классом подгружаемый скрипт типа


Код: java
1.
return getValue()



должен работать

в смысле Test extend BaseClass ? это понятно, что должно работать. мне просто говорили, что там можно не указывать базовый класс, а при загрузке просто подкинуть в качестве базового свой. пробовал и с extends Script и без extends Script..
...
Рейтинг: 0 / 0
12.07.2021, 18:59
    #40083434
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
код работает:

Код: java
1.
2.
3.
4.
5.
public abstract class BaseClass extends Script {
    public String getValue() {
        return "im parent";
    }
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
import org.codehaus.groovy.control.*

...
CompilerConfiguration conf = new CompilerConfiguration();
conf.setScriptBaseClass(BaseClass.class.getName());
GroovyShell shell = new GroovyShell(getClass().getClassLoader(), new Binding(), conf);
Script script = shell.parse("return getValue().toUpperCase()");
Object o = script.run();
System.out.println(o.toString());
...
Рейтинг: 0 / 0
12.07.2021, 20:23
    #40083442
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
Dmitry.
код работает:

Код: java
1.
2.
3.
4.
5.
public abstract class BaseClass extends Script {
    public String getValue() {
        return "im parent";
    }
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
import org.codehaus.groovy.control.*

...
CompilerConfiguration conf = new CompilerConfiguration();
conf.setScriptBaseClass(BaseClass.class.getName());
GroovyShell shell = new GroovyShell(getClass().getClassLoader(), new Binding(), conf);
Script script = shell.parse("return getValue().toUpperCase()");
Object o = script.run();
System.out.println(o.toString());


да, это работает.
А если мне нужно не выполнять написанную в коде строку, а подгрузить груви класс из рядом лежащего текстового файла и выполнить его метод? А перед этим установить ему базовый класс BaseClass.
...
Рейтинг: 0 / 0
12.07.2021, 20:57
    #40083444
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
все то-же самое

если в файле скрипт типа

Код: java
1.
return return getValue().toUpperCase()



то setScriptBaseClass(BaseClass.class.getName()); будет работать

а если в файле класс, то ты должен его унаследовать от нужного тебе супер-класса и setScriptBaseClass в этом случае работать не будет:


Код: java
1.
2.
3.
4.
5.
6.
7.
class Test extends BaseClass{
    def params;

    Object run() {
        return getValue().toUpperCase()
    }
}
...
Рейтинг: 0 / 0
13.07.2021, 15:32
    #40083604
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Встраивание groovy
Dmitry.,

Понятно, спасибо
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Встраивание groovy / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]