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, но я не понимаю, почему он не может их найти, а мой сервлет может. Я полагаю, что это может быть как-то связано с загрузчиком классов, но я боюсь, что понятия не имею, как это исправить.

РЕДАКТИРОВАТЬ:

Некоторые детали:

РЕДАКТИРОВАТЬ:

Я также добавил зависимости для 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 генерируется, когда одна из его зависимостей не найдена во время выполнения, хотя она найдена во время компиляции (проблемы с зависимостями)

Попробуйте добавить эти зависимости и проверьте, разрешены ли они.

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