Comments 28
Гляньте на kotlinlang.org
+2
Спасибо, уже смотрел! Как Kotlin может помочь в проектах с унаследованным кодом при запрете использовать что-либо кроме java?
0
А не возникает проблем с каким-нибудь мусором от класс-лоадера в случае, если такие скрипты массово запускаются по расписанию, и соответственно постоянно перекомпилируются?
0
С таким вариантом использования не сталкивался. Но если нет утечек классов и класслоадеры не создаются миллиардами в короткий интервал времени, то не вижу проблем с выгрузкой классов при GC
0
мы активно используем Groovy скрипты для всяких нестандартных задач (импортов или расчетов), запускаемых по расписанию. Так мы их сознательно запускаем в режиме интерпретатора, без компиляции. Но это сделано на основе теоретических опасений, так сказать, во избежание. Интересно, насколько проблема нами выдумана…
0
Из практики все утечки классов в jvm которые я видел были связаны с ошибками в ПО и лишь один раз точно помню Алексей Рагозин на проекте рассказывал, что утечку памяти в тестах, которую я обнаружил в наших тестах на vicluster-coherence (ныне nanocloud), это не утечка — а особенность сборщика мусора при UseConcMarkSweepGC и большой интенсивности создания новых загрузчиков. Тогда поверил на слово и не стал вгрызаться в детали
0
Раньше был PermGen, теперь MetaSpace… Но суть утечек классов одна — ошибки в ПО и ссылки на классы или их загрузчики. Вот несколько примеров как их избежать в веб приложении
0
Если интересно, посмотрите библиотеку Javassist. github.com/jboss-javassist/javassist jboss-javassist.github.io/javassist
Стабильная, LGPL, существует с 1999. Умеет полноценно компилировать сорцы в памяти. Наследовать существующие классы, с импортами, например.
Стабильная, LGPL, существует с 1999. Умеет полноценно компилировать сорцы в памяти. Наследовать существующие классы, с импортами, например.
+1
Спасибо за совет! Есть разница в удобстве работы между компилятором ecj и javassist, о чем я уже писал «Модификация программы и что лучше менять: исполняемый код или AST программы?». Также есть библиотеки
ASM, javassist, BCEL, CGLIB
ASM, javassist, BCEL, CGLIB
0
Я посмотрел вашу статью, в ней нет прямых указаний, чем ecj удобнее именно для геренации новых классов на рантайме. Одним из очевидных недостатков высокоуровнего API javassist является отсутствие поддержки generics, но насколько это важно?
0
Отредактировать исходный код в любом редакторе удобнее и компиляция на лету, с полной поддержкой конструкций языка удобнее чем, чем манипуляции с API для генерации байткода. У javassist/asm своя ниша, где ими удобнее решать задачи: модификация существующего байткода без исходников
-1
Я согласен, но всё-таки для скриптинга скорее пригодится не загрузка класса из файла целиком, а только части. Если речь идёт о замене хотсвапа, то тогда ваше решение, конечно, лучше. Интересно, в вашем проекте вот эти файлы, которые потом динамически грузятся, они лежат под source control?
0
Нет, в файловой системе или на веб. Хотя в планах хранить в git скрипты
0
Каждой задаче надо подбирать свой более подходящий инструмент (учитывая все ограничения задачи и инструмента, стоимость эксплуатации)
0
Думаю, вам так же будет интересен такой подход habrahabr.ru/company/haulmont/blog/248981
0
Спасибо, это тот же JSR 199 (Java 1.6 — ToolProvider.getSystemJavaCompiler ). Без уже установленного tools.jar в этом подходе реализацию компилятора не найти. По хорошему надо носить с собой компилятор и искать его как-то так (CompilerUtil):
и только после этого
>>Как еще можно быстро доставить изменения на сервер -> «Второй способ — Hot Deploy»
сюда же можно добавить OSGI
ServiceLoader<JavaCompiler> javaCompilers = ServiceLoader.load(JavaCompiler.class);
for (JavaCompiler javaCompiler : javaCompilers) {
return javaCompiler;
}
и только после этого
ToolProvider.getSystemJavaCompiler();
>>Как еще можно быстро доставить изменения на сервер -> «Второй способ — Hot Deploy»
сюда же можно добавить OSGI
+1
igor_suhorukov
Зачем использовать вместо, когда можно использовать вместе ?)
Зачем использовать вместо, когда можно использовать вместе ?)
0
Как автор похожего решения хотел бы задать вам несколько вопросов.
1. Как реализована совместная компиляция и обновление зависимостей? Например я компилирую класс, от которого зависят другие динамически скомпилированные классы?
2. Есть ли кэш классов, и где он хранится (если есть)?
3. Не пробовали ли вы подружить вашу загрузку классов со Spring, или чем-то похожим?
1. Как реализована совместная компиляция и обновление зависимостей? Например я компилирую класс, от которого зависят другие динамически скомпилированные классы?
2. Есть ли кэш классов, и где он хранится (если есть)?
3. Не пробовали ли вы подружить вашу загрузку классов со Spring, или чем-то похожим?
+1
Это ваше решение? Молодцы!
А как вы живете с тем, что компилятор нельзя включать в свое решение и надо надеяться на tools.jar?
1. Не реализовано. Это удел систем типа JRebel или динамических систем типа OSGI. Мое мнение, что пока не будет реализовано в JVM JEP 159: Enhanced Class Redefinition. Каждая реализация такого механизма самостоятельно — очень сложная задача.
2. Классы кешируются в загрузчике org.codehaus.commons.compiler.jdk.JavaFileManagerClassLoader.
3. Не пробовал
А как вы живете с тем, что компилятор нельзя включать в свое решение и надо надеяться на tools.jar?
1. Не реализовано. Это удел систем типа JRebel или динамических систем типа OSGI. Мое мнение, что пока не будет реализовано в JVM JEP 159: Enhanced Class Redefinition. Каждая реализация такого механизма самостоятельно — очень сложная задача.
2. Классы кешируются в загрузчике org.codehaus.commons.compiler.jdk.JavaFileManagerClassLoader.
3. Не пробовал
+1
Спасибо за ответ.
Первый пункт — действительно непростая задача. Конкретно для наших приложений мы решили ее построением дерева зависимостей при компиляции классов. В момент когда какой-то класс меняется мы ищем все классы, зависящие от него (которые его импортят) и компилируем их тоже. Это хорошо работает, особенно если мы перезагружаем сразу целый функциональный модуль. В одном из наших проектов мы весь пользовательский интерфейс делали динамически компилируемым.
Первый пункт — действительно непростая задача. Конкретно для наших приложений мы решили ее построением дерева зависимостей при компиляции классов. В момент когда какой-то класс меняется мы ищем все классы, зависящие от него (которые его импортят) и компилируем их тоже. Это хорошо работает, особенно если мы перезагружаем сразу целый функциональный модуль. В одном из наших проектов мы весь пользовательский интерфейс делали динамически компилируемым.
+1
UFO just landed and posted this here
MVEL2 тоже похож на java, но не java и тоже менее навороченный
+1
Sign up to leave a comment.
Articles
Change theme settings
Java вместо Groovy