I'm developing a simple, training application with Spring MVC and Hibernate. I'm using Maven as build tool. All dependencies (spring, hibernate, aopalliance, junit etc.) are resolved using Maven's pom.xml file.
$ mvn war:war glassfish:deploy
works absolutley fine, the project is being deployed to the GlassFish server - all *.jar
files are copied (including com.springsource.org.aopalliance-1.0.0.jar
).
I've made a simple servlet to test whether aopalliance exisists within classpath:
protected void doGet(...) throws ... {
response.getWriter().println(org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName());
}
And it exists. The above code displays org.aopalliance.intercept.MethodInterceptor
as expected.
However if I change the servlet into something like that:
protected void doGet(...) throws ... {
response.getWriter().println(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName());
}
It throws an exception:
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
TransactionInterceptor
uses aopalliance interfaces, but I don't understand why it cannot find them, while my servlet can. I believe it might be somehow related to the classloader, but I'm affraid I have no idea how to fix it.
Some details:
pom.xml
file: http://pastebin.com/430iPgRsHelloServlet
class: http://pastebin.com/YVfzz4i8I've also added dependencies for spring.osgi.core/io
as suggested by @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>
But it didn't fix the problem.
However, I've tried to run the very same application on VMware vFabric tc Server, which is delivered with SpringSource Tool Suite, and everything worked just fine. This seems to be GlassFish-specific issue.
I'm using GlassFish Server Open Source Edition 3.1.1.
Another strange thing: if I redeploy application (using "Publish" in Eclipse) the servlet throws:
java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
But after refresh (whitin a browser) I get:
java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor
Further refreshes don't change anything.
You might have another and incomplete spring somewhere in parent classloader, most likely in {domaindir}/lib