我正在使用 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 可以。我相信它可能与类加载器有关,但我害怕我不知道如何修复它。
编辑:
一些细节:
- 完整
pom.xml
文件: http: //pastebin.com/430iPgRs - 完整
HelloServlet
课程: http: //pastebin.com/YVfzz4i8 - 异常完整堆栈跟踪: http: //pastebin.com/UZ5nAJdZ
编辑:
我还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
进一步的刷新不会改变任何东西。