Spring генерирует NoClassDefFoundError: MethodInterceptor, хотя класс существует в classpath
Я разрабатываю простое обучающее приложение с Spring MVC и Hibernate. Я использую Maven в качестве инструмента для сборки. Все зависимости (весна, спящий режим, aopalliance, junit и т. Д.) Разрешаются с помощью файла Maven pom.xml.
$ mvn war:war glassfish:deploy
отлично работает, проект развертывается на сервере GlassFish - все *.jar
файлы копируются (в том числе com.springsource.org.aopalliance-1.0.0.jar
).
Я сделал простой сервлет, чтобы проверить, существует ли aopalliance в classpath:
protected void doGet(...) throws ... {
response.getWriter().println(org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName());
}
И это существует. Приведенный выше код отображает org.aopalliance.intercept.MethodInterceptor
как и ожидалось.
Однако, если я изменю сервлет на что-то подобное:
protected void doGet(...) throws ... {
response.getWriter().println(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName());
}
Выдает исключение:
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
TransactionInterceptor
использует интерфейсы aopalliance, но я не понимаю, почему он не может их найти, а мой сервлет может. Я полагаю, что это может быть как-то связано с загрузчиком классов, но я боюсь, что понятия не имею, как это исправить.
РЕДАКТИРОВАТЬ:
Некоторые детали:
- полный
pom.xml
файл: http://pastebin.com/430iPgRs - полный
HelloServlet
класс: http://pastebin.com/YVfzz4i8 - Трассировка полного стека исключений: http://pastebin.com/UZ5nAJdZ
РЕДАКТИРОВАТЬ:
Я также добавил зависимости для spring.osgi.core/io
как предложено @Ravi:
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.io</artifactId>
<version>1.2.1</version>
</dependency>
Но это не решило проблему.
Тем не менее, я попытался запустить то же самое приложение на VMware vFabric tc Server, которое поставляется с SpringSource Tool Suite, и все работало просто отлично. Похоже, что это проблема GlassFish.
Я использую GlassFish Server Open Source Edition 3.1.1.
Еще одна странная вещь: если я повторно разверну приложение (используя "Опубликовать" в Eclipse), сервлет выдаст:
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
Но после обновления (в браузере) я получаю:
java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor
Дальнейшие обновления ничего не меняют.
3 ответа
У вас может быть другая и неполная пружина где-то в родительском загрузчике классов, скорее всего, в {domaindir}/lib
У меня была такая же проблема, и после почти недели поиска ответов я обнаружил, что вам нужен aopalliance.jar. Это решило мою проблему.
Включили ли вы Jar-файлы транзакций Spring в ваш путь к классам. Источник TransactionInterceptor.java содержит ссылку на некоторые из org.springframework.transaction
а также org.springframework.transaction.support
пакеты.
В вашем первом фрагментеorg.aopalliance.intercept.MethodInterceptor.class.getCanonicalName()
вы загружаете только класс aopalliance, который не зависит от библиотек Spring Transaction.
Во втором фрагменте вы загружаете класс TransactionInterceptor и его зависимости (org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName()
). Второе исключение, которое вы видите после обновления браузера, имеет смысл по сравнению с предыдущей ошибкой (до обновления браузера)
Первый фрагмент является независимым классом, но второй фрагмент является загрузкой класса Spring, которая является оберткой над aopalliance. Spring пытается загрузить свои собственные зависимости (классы, связанные с транзакциями и реализация aopalliance).
java.lang.NoClassDefFoundError
генерируется, когда одна из его зависимостей не найдена во время выполнения, хотя она найдена во время компиляции (проблемы с зависимостями)
Попробуйте добавить эти зависимости и проверьте, разрешены ли они.