#java #grails #renjin
#java #grails #renjin
Вопрос:
Я пытаюсь использовать Renjin в качестве файла Jar в нашем приложении Grails. При запуске появилось следующее исключение:
BeanCreationException: Error creating bean with name 'appService': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/core/DebuggingClassWriter
- Платформа: Windows 7
- Версия Grails для приложения: Grails 2.2.3
- Версия Renjin: 0.7.0-RC7
Лучший результат в поиске Google, вероятно, является единственным релевантным сообщением: NoClassDefFoundError в приложении Grails с использованием XWiki с синтаксисом Markdown
Это указывает на конфликт файлов jar между Grails cglib-2.2 / asm-3.1 и другим jar, который вы указали в пути к классу. В моем случае я предполагаю, что файл jar Renjin.
Я решил перейти на cglib 3.0 и asm 4.0. Конфликт, похоже, разрешен. Однако автор сообщения предупреждает, что есть вероятность, что могут быть затронуты другие функции приложения.
Конечно, я мог бы повторно протестировать все приложение еще раз (это займет некоторое время, но выполнимо). Мои вопросы:
- Как asm и cglib используются в Grails?
- Какая часть приложения может быть затронута?
- Использует ли Renjin библиотеку cglib или asm?
Обновить:
Как ни странно, когда я создаю новое приложение Grails с Grails 2.2.3 (cglib-2.2 / asm-3.1) и помещаю jar-файл Renjin в classpath, приложение запускается без проблем.
Я немного поискал об asm и cglib. Кажется, что они
используется для изменения существующих классов или динамической генерации классов непосредственно в двоичной форме
цитируется с домашней страницы ASM. Так являются ли они библиотекой, которая позволяет нам изменять код Grails и просматривать изменения без перезапуска приложения? Означает ли это, что затронуто все приложение, и я должен все это повторно протестировать?
Комментарии:
1. cglib (и, следовательно, asm) используется Spring для создания прокси-классов, которые заставляют работать транзакционные сервисы. Hibernate выполняет аналогичный трюк с прокси-классами, но использует javassist вместо cglib.
Ответ №1:
Renjin использует asm для компиляции частей R-кода «на лету». Я думаю, что asm, вероятно, является еще одним случаем, в дополнение к guava, который мы должны переупаковать, чтобы избежать раздражающих конфликтов версий, подобных тому, который вы описываете. Можете ли вы добавить отчет о проблеме на github? Также см. jersey-guava для примера того, как это сделать, и отправьте запрос на извлечение, если у вас есть время.