|
Встраивание groovy
|
|||
---|---|---|---|
#18+
Понадобилось мне в java проект встроить использование расширений, которые будут писаться сторонними разработчиками и подкладываться в виде исходников. умные люди посоветовали использовать груви. Эти же самые умные люди сказали, что есть возможность в своём проекте написать класс с полезными функциями и при подключение груви класса устанавливать свой класс в качестве базового, чтобы в груви коде были доступны всякие полезности. После этого умный человек ушёл в отпуск и уехал отдыхать. А я что то туплю и никак не нагуглю, как это сделать правильно. Подскажите пожалуйста - действительно ли есть такая возможность и если есть - как это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 15:46 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
А в какой момент времени эти "сторонние люди" будут подкладывать расширения? В компилляции? В рантайме? Или перед запуском бинарника? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 17:08 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
SpringMan, Смотрел. Параметры пробрасываются без проблем. Забираются тоже. Методы из груви тоже запускаются. Базовый класс установить не получается Я полагал, должно быть что то вроде CompilerConfiguration conf = new CompilerConfiguration(); conf.setScriptBaseClass(BaseClass.class.getName()); GroovyShell shell = new GroovyShell(getClass().getClassLoader(), new Binding(), conf); где BaseClass - класс из проекта. Мне хотелось бы, чтобы после этого подгруженные классы наследовали методы моего BaseClass. Что то то ли я что то упускаю, то ли это в принципе делается не так ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 17:14 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
mayton А в какой момент времени эти "сторонние люди" будут подкладывать расширения? В компилляции? В рантайме? Или перед запуском бинарника? В рантайме. Иначе зачем городить огород с подгрузкой исходников? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 17:15 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
Покажи код, не совсем понимаю в чем проблема. К примеру с таким baseClass-ом: Код: java 1. 2. 3. 4. 5.
внутри скрипта можно вызывать getValue() ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 17:27 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
Можно просто использовать классы из класслоадера. Не обязательно вообще использовать baseClass - можно импортануть нужное внутри руками ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 17:33 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
SpringMan Покажи код, не совсем понимаю в чем проблема. К примеру с таким baseClass-ом: Код: java 1. 2. 3. 4. 5.
внутри скрипта можно вызывать 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() ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:06 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
SpringMan Можно просто использовать классы из класслоадера. Не обязательно вообще использовать baseClass - можно импортануть нужное внутри руками имеется ввиду внутри подгружаемого скрипта? динамически подгружать классы ? не хотелось бы. предполагается, что то будет некое ядро, которое разные команды будут расширять под свои нужды - сказать, что вы вот можете подкладывать сюда скрипты, которым будет доступен такой то функционал - гораздо лучше, чем сказать, что вы можете класлоадером грузить классы и у вас наступит щастье ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:12 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
xerxf, почему Test extends Script ? если ты объявляешь класс - то все следует правилам джавы и setScriptBaseClass не используется если ты работаешь со скриптом (нет объявления класса) то будет использоваться setScriptBaseClass т.е. с твоим бейз классом подгружаемый скрипт типа Код: java 1.
должен работать ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:21 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
Dmitry. xerxf, почему Test extends Script ? если ты объявляешь класс - то все следует правилам джавы и setScriptBaseClass не используется если ты работаешь со скриптом (нет объявления класса) то будет использоваться setScriptBaseClass т.е. с твоим бейз классом подгружаемый скрипт типа Код: java 1.
должен работать в смысле Test extend BaseClass ? это понятно, что должно работать. мне просто говорили, что там можно не указывать базовый класс, а при загрузке просто подкинуть в качестве базового свой. пробовал и с extends Script и без extends Script.. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:27 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
код работает: Код: java 1. 2. 3. 4. 5.
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 18:59 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
Dmitry. код работает: Код: java 1. 2. 3. 4. 5.
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
да, это работает. А если мне нужно не выполнять написанную в коде строку, а подгрузить груви класс из рядом лежащего текстового файла и выполнить его метод? А перед этим установить ему базовый класс BaseClass. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 20:23 |
|
Встраивание groovy
|
|||
---|---|---|---|
#18+
все то-же самое если в файле скрипт типа Код: java 1.
то setScriptBaseClass(BaseClass.class.getName()); будет работать а если в файле класс, то ты должен его унаследовать от нужного тебе супер-класса и setScriptBaseClass в этом случае работать не будет: Код: java 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2021, 20:57 |
|
|
start [/forum/topic.php?fid=59&msg=40083604&tid=2120398]: |
0ms |
get settings: |
17ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
34ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
257ms |
get tp. blocked users: |
0ms |
others: | 360ms |
total: | 679ms |
0 / 0 |