Java Spring抛出NoClassDefFoundError:MethodInterceptor,尽管类在类路径中存在

Java Spring抛出NoClassDefFoundError:MethodInterceptor,尽管类在类路径中存在,java,spring,glassfish,dependency-management,aopalliance,Java,Spring,Glassfish,Dependency Management,Aopalliance,我正在用SpringMVC和Hibernate开发一个简单的培训应用程序。我使用Maven作为构建工具。 所有依赖项(spring、hibernate、aopalliance、junit等)都使用Maven的pom.xml文件进行解析 $mvn war:war glassfish:deploy工作绝对正常,项目正在部署到glassfish服务器-所有*.jar文件都被复制(包括com.springsource.org.aopalliance-1.0.0.jar) 我制作了一个简单的servlet

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

$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可以。我相信它可能与类加载器有某种联系,但我很惊讶我不知道如何修复它

编辑: 一些细节:

  • 完成
    pom.xml
    文件:
  • 完成HelloServlet<代码>类:
  • 异常完整堆栈跟踪:
编辑: 我还添加了@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>
但在刷新后(在浏览器中),我得到:


进一步刷新不会改变任何东西。

您是否在类路径中包含了Spring事务JAR。 的源代码包含对一些
org.springframework.transaction
org.springframework.transaction.support
包的引用

在您的第一个片段中
org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName()
您只加载对Spring事务库没有依赖关系的aopalliance类

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

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

java.lang.NoClassDefFoundError
在运行时找不到它的一个依赖项时抛出,尽管它是在编译时找到的(依赖项问题)


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

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

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

可能您正在尝试升级到Spring 3.1.0。RELEASE@Ravi:我正在使用3.1.0.RELEASE。我已经用一些细节更新了我的问题。您是否尝试在调试器下调查类加载器路径?看起来servlet的类加载器没有访问此类的权限。我会在doGet上设置一个断点,当到达时为NoClassDefFoundError添加一个异常断点并调查类加载器层次结构路径,这可能会给您一个提示。因为Glassfish是OSGI,您可能会在这里遇到问题。尽管如此,您是否尝试构建war,并在WEB-INF/lib中查找缺少的类?@mrembisz:
WebappClassLoader
对象具有
jarRealFiles
属性(类型为
File[]
),我可以在那里找到
文件(…\WEB-INF\lib\com.springsource.org.aopalliance-1.0.0.jar)
我有JARE,其中包含:
org.aopalliance[.intercept]
org.springframework.transaction[.support]
编译时和运行时的包。我不确定我是否理解正确,但为什么Spring试图加载它自己的依赖项,而它们已经可用?一些类加载器问题?另外,在VMware vFabric tc服务器上运行的同一个项目运行得很好。这很烦人。如果您使用maven来构建它,那么它应该解决所有的依赖关系。确保没有将任何依赖范围设置为“提供”。NoClassDefFoundError表明“org.springframework.transaction.interceptor.TransactionInterceptor”的依赖关系树中缺少一些jar。org.springframework.transaction.interceptor.java中的所有导入语句及其依赖项都应该存在于glassfish webapp服务器中。当它与vFabric一起工作时,它肯定是缺少依赖项的。你能试着在Tomcat中部署并检查它是否有效吗?你能详细解释一下这个答案吗。我面临一个问题,MyWar使用MyJar作为依赖项,而MyWar的spring无法找到MyJar的类。它只是说NoClassDefFound,实际上eclipse/maven正在正确构建它,而MyJar就在(MyWar摘录的)库中。
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor