Понадобилось мне тут необычное. Web-сервис, где пользователь может ввести кусок Java кода (желательно чтоб еще и Kotlin поддерживать) на веб-страничке, бэкенд берет этот кусок кода, собирает, загружает как плагин и подцепляет к API самого сервиса.
Чем нынче такое модно делать? Может где-то есть примеры чтоб подсмотреть? Кое-какие мысли у меня есть, но вдруг с какими-нибудь новомодными Graal-компиляторами всё окажется проще и удобнее.
Здравствуйте, Artem Korneev, Вы писали:
AK>Понадобилось мне тут необычное. Web-сервис, где пользователь может ввести кусок Java кода (желательно чтоб еще и Kotlin поддерживать) на веб-страничке, бэкенд берет этот кусок кода, собирает, загружает как плагин и подцепляет к API самого сервиса.
AK>Чем нынче такое модно делать? Может где-то есть примеры чтоб подсмотреть? Кое-какие мысли у меня есть, но вдруг с какими-нибудь новомодными Graal-компиляторами всё окажется проще и удобнее.
По-мне просто сохранить в java-файл с нужным хедером и футером, скомпилить в .class-файлы и подгрузить своим класслоадером. То же самое с котлином. Тут вероятно надо на безопасность смотреть, так что курить все эти фичи безопасности, чтобы этот код не баловался, но вроде все механизмы в жаве для этого есть, хоть они и часто дырявые и вообще вроде их думают убирать, но пока как-то работает.
Re[2]: Чем собрать плагин из исходников в рантайме?
Здравствуйте, vsb, Вы писали:
vsb>По-мне просто сохранить в java-файл с нужным хедером и футером, скомпилить в .class-файлы и подгрузить своим класслоадером.
Вот, начиная со слова "класслоадер", звучит уже пугающе.
Я не игрался с класс-лоадером, но мне почему-то кажется, что такая загрузка потребует перезапуска приложения. Не?
vsb>Тут вероятно надо на безопасность смотреть, так что курить все эти фичи безопасности, чтобы этот код не баловался, но вроде все механизмы в жаве для этого есть, хоть они и часто дырявые и вообще вроде их думают убирать, но пока как-то работает.
Да, безопасность всего этого будет отдельной темой для раздумий. Но сначала надо сделать чтоб работало.
С уважением, Artem Korneev.
Re[3]: Чем собрать плагин из исходников в рантайме?
AK>Вот, начиная со слова "класслоадер", звучит уже пугающе. AK>Я не игрался с класс-лоадером, но мне почему-то кажется, что такая загрузка потребует перезапуска приложения. Не?
Не. Но сделать решение с кастомным класс-лоадером всё правильно и надёжно — не очень тривиально, куча граблей. Начни лучше с jsr223.
vsb>>Тут вероятно надо на безопасность смотреть, так что курить все эти фичи безопасности, чтобы этот код не баловался, но вроде все механизмы в жаве для этого есть, хоть они и часто дырявые и вообще вроде их думают убирать, но пока как-то работает. AK>Да, безопасность всего этого будет отдельной темой для раздумий. Но сначала надо сделать чтоб работало.
Это зря, думай сейчас. Возможно в итоге тебе придётся запускать другие процессы и общаться через сокеты-пайпы. Иначе, например, от OOM защиты вообще никакой нет — падать будет всё.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Чем собрать плагин из исходников в рантайме?
Здравствуйте, Artem Korneev, Вы писали:
vsb>>По-мне просто сохранить в java-файл с нужным хедером и футером, скомпилить в .class-файлы и подгрузить своим класслоадером.
AK>Вот, начиная со слова "класслоадер", звучит уже пугающе. AK>Я не игрался с класс-лоадером, но мне почему-то кажется, что такая загрузка потребует перезапуска приложения. Не?
Нет. Можно грузить новые классы, сборщик мусора будет собирать и их и класслоадеры, когда они станут более не используемыми, хоть тыщу раз в секунду грузи новые без перерыва, проблем не должно быть. Один момент только, надо следить, чтобы на загруженные классы потом не оставалось висящих ссылок, иначе не выгрузятся (если надо выгружать/загружать постоянно). Чаще всего их держат всякие ThreadLocal-ы. Поэтому можно ещё дополнительно запускать отдельный поток для выполнения загружаемого кода и потом его завершать.
vsb>>Тут вероятно надо на безопасность смотреть, так что курить все эти фичи безопасности, чтобы этот код не баловался, но вроде все механизмы в жаве для этого есть, хоть они и часто дырявые и вообще вроде их думают убирать, но пока как-то работает.
AK>Да, безопасность всего этого будет отдельной темой для раздумий. Но сначала надо сделать чтоб работало.
Кстати в стандартной JDK есть некий Java Compiler API. Так что можно даже не заморачиваться с вызовом внешних программ. Ещё и побыстрей работать будет.
Здравствуйте, Artem Korneev, Вы писали:
AK>Понадобилось мне тут необычное. Web-сервис, где пользователь может ввести кусок Java кода (желательно чтоб еще и Kotlin поддерживать) на веб-страничке, бэкенд берет этот кусок кода, собирает, загружает как плагин и подцепляет к API самого сервиса.
AK>Чем нынче такое модно делать? Может где-то есть примеры чтоб подсмотреть? Кое-какие мысли у меня есть, но вдруг с какими-нибудь новомодными Graal-компиляторами всё окажется проще и удобнее.
Подумайте — может быть вам подойдёт JavaScript (в Java есть Scripting API)? С ним работать из вашей программы будет намного проще.
Re[2]: Чем собрать плагин из исходников в рантайме?
Здравствуйте, Аноним, Вы писали:
А>Подумайте — может быть вам подойдёт JavaScript (в Java есть Scripting API)? С ним работать из вашей программы будет намного проще.
Не, за подсказку спасибо, но вот с JavaScript связываться не хочется вообще. Проект любительский, выбор языка за мной, но я, по возможности, избегаю джаваскрипт.