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 вашего приложения.
Возможные решения в порядке предпочтения:
- Избавьтесь от Spring JAR-файлов из каталога lib сервера. Они не должны быть там, это просто плохая идея. Но вы говорите, что не можете этого сделать.
- Добавьте cglib в каталог lib сервера. Не вариант по той же причине, что и выше.
- Добавьте дубликаты Spring JAR-файлов в каталог lib вашего приложения. Убедитесь, что они точно такие же, как на сервере, иначе вы рискуете получить странные конфликты версий классов. Это должно позволить разрешить cglib.
Вариант 3 далеко не идеален, так как дублирование классов между загрузчиками классов является рецептом для проблем загрузчика классов, но это может быть ваш единственный вариант.