Spring抛出NoClassDefFoundError:MethodInterceptor虽然class存在于classpath中

时间:2012-02-06 01:48:43

标签: java spring glassfish dependency-management aopalliance

我正在使用Spring MVC和Hibernate开发一个简单的培训应用程序。我正在使用Maven作为构建工具。 使用Maven的pom.xml文件解析所有依赖项(spring,hibernate, aopalliance ,junit等)。

$ mvn war:war glassfish:deploy无法正常工作,项目正在部署到GlassFish服务器 - 所有*.jar个文件都被复制(包括com.springsource.org.aopalliance-1.0.0.jar)。

我已经制作了一个简单的servlet来测试类路径中是否存在aopalliance:

protected void doGet(...) throws ... {
    response.getWriter().println(org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName());
}

它存在。上面的代码按预期显示org.aopalliance.intercept.MethodInterceptor

但是,如果我将servlet更改为类似的东西:

protected void doGet(...) throws ... {
    response.getWriter().println(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName());
}

它抛出异常:

java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

TransactionInterceptor使用了aopalliance接口,但我不明白为什么它找不到它们,而我的servlet可以。我相信它可能与类加载器有某种关系,但我很害怕我不知道如何修复它。

编辑:

一些细节:

编辑:

我还根据@Ravi的建议添加了spring.osgi.core/io的依赖关系:

<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开源版3.1.1。

另一个奇怪的事情是:如果我重新部署应用程序(在Eclipse中使用“Publish”),servlet会抛出:

java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

但刷新后(浏览器中)我得到:

java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor

进一步刷新不会改变任何内容。

3 个答案:

答案 0 :(得分:7)

我有同样的问题,在寻找答案近一周后,我发现你需要aopalliance.jar。这解决了我的问题。

答案 1 :(得分:1)

你可能在父类加载器的某个地方有另一个不完整的弹簧,很可能在{domaindir} / lib

答案 2 :(得分:0)

您是否在类路径中包含了Spring事务jar。 TransactionInterceptor.java的来源包含对某些org.springframework.transactionorg.springframework.transaction.support个包的引用。

在你的第一个片段中 org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName()您只加载了与Spring Transaction库无关的aopalliance类。

在第二个片段中,您正在加载TransactionInterceptor类及其依赖项(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName())。 与先前的错误(浏览器刷新之前)相比,您在浏览器刷新后看到的第二个例外是有意义的

第一个片段是一个独立的类,但第二个片段是一个Spring类加载,它是一个onopalliance的包装器。 Spring正在尝试加载自己的依赖项(与事务相关的类和aopalliance实现)。

当在运行时找不到其中一个依赖项时抛出

java.lang.NoClassDefFoundError,尽管它在编译时发现(依赖性问题)

尝试添加这些依赖项并检查它是否已解析。