Spring генерирует NoClassDefFoundError: MethodInterceptor, хотя класс существует в classpath - PullRequest
3 голосов
/ 06 февраля 2012

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

EDIT:

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

EDIT:

Я также добавил зависимости для 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 ]

7 голосов
/ 28 марта 2013

У меня была та же проблема, и после почти недели поиска ответов я обнаружил, что вам нужен aopalliance.jar. Это решило мою проблему.

1 голос
/ 10 февраля 2012

Возможно, у вас есть другой и неполный источник где-то в родительском загрузчике классов, скорее всего, в {domaindir} / lib

0 голосов
/ 07 февраля 2012

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

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

...