Spring Framework не видит cglib на JBoss

Мое приложение использует Spring Framework 3.0.5 на JBoss 5.1.0.GA. Фреймворк предоставляется сервером, то есть библиотеки фреймворков размещаются в server/<servername>/lib каталог. Сервер управляется третьей стороной, поэтому я не могу добавить какую-либо библиотеку в среду, предоставляемую этим сервером. В моем приложении есть необходимость использовать cglib. Spring использует его для целей прокси. Cglib не в server/<servername>/libПоэтому я включил cglib-2.2.2.jar в мое приложение .war с мавеном

Проблема в том, что при развертывании возникает следующая ошибка:

Не удается получить целевой класс прокси, потому что CGLIB2 недоступен. Добавьте CGLIB в путь к классу или укажите прокси-интерфейсы.

Я проверил свое приложение .war для cglib и нашел его в WEB-INF/lib каталог. AFAIK все классы в банках, расположенных в этом каталоге, находятся в пути к классам, а также классы в банках в server/<servername>/lib, Почему Spring не может найти cglib?

1 ответ

Решение

Для целей этого вопроса иерархия загрузчика классов JBoss может выглядеть только "вниз", то есть классы, загруженные системным загрузчиком классов, не могут видеть классы в каталоге lib приложения. Таким образом, библиотеки Spring в каталоге lib сервера не могут видеть cglib в каталоге lib вашего приложения.

Возможные решения в порядке предпочтения:

  1. Избавьтесь от Spring JAR-файлов из каталога lib сервера. Они не должны быть там, это просто плохая идея. Но вы говорите, что не можете этого сделать.
  2. Добавьте cglib в каталог lib сервера. Не вариант по той же причине, что и выше.
  3. Добавьте дубликаты Spring JAR-файлов в каталог lib вашего приложения. Убедитесь, что они точно такие же, как на сервере, иначе вы рискуете получить странные конфликты версий классов. Это должно позволить разрешить cglib.

Вариант 3 далеко не идеален, так как дублирование классов между загрузчиками классов является рецептом для проблем загрузчика классов, но это может быть ваш единственный вариант.

Другие вопросы по тегам