Renjin несовместим с приложением Grails и как библиотеки asm и cglib используются в Grails

#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 для примера того, как это сделать, и отправьте запрос на извлечение, если у вас есть время.