3

我正在使用 Spring MVC 和 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 可以。我相信它可能与类加载器有关,但我害怕我不知道如何修复它。

编辑:

一些细节:

编辑:

我还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>

但它并没有解决问题。

但是,我尝试在随 SpringSource Tool Suite 提供的 VMware vFabric tc Server 上运行相同的应用程序,并且一切正常。这似乎是 GlassFish 特有的问题。

我正在使用 GlassFish Server 开源版 3.1.1。

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

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

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

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

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

4

3 回答 3

7

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

于 2013-03-27T21:18:40.537 回答
1

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

于 2012-02-10T06:50:32.007 回答
0

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

在您的第一个片段 org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName()中,您只加载了不依赖于 Spring Transaction 库的 aopalliance 类。

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

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

java.lang.NoClassDefFoundError当在运行时未找到其依赖项之一时抛出,尽管它在编译时找到(依赖问题)

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

于 2012-02-07T01:21:18.120 回答