Pull to refresh

Comments 28

Спасибо, уже смотрел! Как Kotlin может помочь в проектах с унаследованным кодом при запрете использовать что-либо кроме java?
Это же JVM) он также работает с Java как и Scala или Groovy
Groovy/Scala тоже JVM. Ограничение относится к гомогенности разработки — запрету на добавление новых языков в проект.
А не возникает проблем с каким-нибудь мусором от класс-лоадера в случае, если такие скрипты массово запускаются по расписанию, и соответственно постоянно перекомпилируются?
С таким вариантом использования не сталкивался. Но если нет утечек классов и класслоадеры не создаются миллиардами в короткий интервал времени, то не вижу проблем с выгрузкой классов при GC
мы активно используем Groovy скрипты для всяких нестандартных задач (импортов или расчетов), запускаемых по расписанию. Так мы их сознательно запускаем в режиме интерпретатора, без компиляции. Но это сделано на основе теоретических опасений, так сказать, во избежание. Интересно, насколько проблема нами выдумана…
Из практики все утечки классов в jvm которые я видел были связаны с ошибками в ПО и лишь один раз точно помню Алексей Рагозин на проекте рассказывал, что утечку памяти в тестах, которую я обнаружил в наших тестах на vicluster-coherence (ныне nanocloud), это не утечка — а особенность сборщика мусора при UseConcMarkSweepGC и большой интенсивности создания новых загрузчиков. Тогда поверил на слово и не стал вгрызаться в детали
Я посмотрел вашу статью, в ней нет прямых указаний, чем ecj удобнее именно для геренации новых классов на рантайме. Одним из очевидных недостатков высокоуровнего API javassist является отсутствие поддержки generics, но насколько это важно?
Отредактировать исходный код в любом редакторе удобнее и компиляция на лету, с полной поддержкой конструкций языка удобнее чем, чем манипуляции с API для генерации байткода. У javassist/asm своя ниша, где ими удобнее решать задачи: модификация существующего байткода без исходников
Я согласен, но всё-таки для скриптинга скорее пригодится не загрузка класса из файла целиком, а только части. Если речь идёт о замене хотсвапа, то тогда ваше решение, конечно, лучше. Интересно, в вашем проекте вот эти файлы, которые потом динамически грузятся, они лежат под source control?
Нет, в файловой системе или на веб. Хотя в планах хранить в git скрипты
Просто тогда не совсем понятно, чем это отличается от просто модулей проекта. Возможностью патчинга кода на лету? Почему это называется скриптами?
В том числе и динамического расширения функциональности. OSGI вполне решил бы большую часть динамизма системы и модулей
Каждой задаче надо подбирать свой более подходящий инструмент (учитывая все ограничения задачи и инструмента, стоимость эксплуатации)
Спасибо, это тот же JSR 199 (Java 1.6 — ToolProvider.getSystemJavaCompiler ). Без уже установленного tools.jar в этом подходе реализацию компилятора не найти. По хорошему надо носить с собой компилятор и искать его как-то так (CompilerUtil):
ServiceLoader<JavaCompiler> javaCompilers = ServiceLoader.load(JavaCompiler.class);
for (JavaCompiler javaCompiler : javaCompilers) {
     return javaCompiler;
}

и только после этого
ToolProvider.getSystemJavaCompiler();

>>Как еще можно быстро доставить изменения на сервер -> «Второй способ — Hot Deploy»
сюда же можно добавить OSGI
Причины в статье и в коментариях. Вместе конечно лучше
Как автор похожего решения хотел бы задать вам несколько вопросов.

1. Как реализована совместная компиляция и обновление зависимостей? Например я компилирую класс, от которого зависят другие динамически скомпилированные классы?
2. Есть ли кэш классов, и где он хранится (если есть)?
3. Не пробовали ли вы подружить вашу загрузку классов со Spring, или чем-то похожим?

Это ваше решение? Молодцы!
А как вы живете с тем, что компилятор нельзя включать в свое решение и надо надеяться на tools.jar?

1. Не реализовано. Это удел систем типа JRebel или динамических систем типа OSGI. Мое мнение, что пока не будет реализовано в JVM JEP 159: Enhanced Class Redefinition. Каждая реализация такого механизма самостоятельно — очень сложная задача.
2. Классы кешируются в загрузчике org.codehaus.commons.compiler.jdk.JavaFileManagerClassLoader.
3. Не пробовал
Спасибо за ответ.

Первый пункт — действительно непростая задача. Конкретно для наших приложений мы решили ее построением дерева зависимостей при компиляции классов. В момент когда какой-то класс меняется мы ищем все классы, зависящие от него (которые его импортят) и компилируем их тоже. Это хорошо работает, особенно если мы перезагружаем сразу целый функциональный модуль. В одном из наших проектов мы весь пользовательский интерфейс делали динамически компилируемым.

UFO just landed and posted this here
MVEL2 тоже похож на java, но не java и тоже менее навороченный
Sign up to leave a comment.

Articles

Change theme settings