Question

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.

EDIT:

Some details:

EDIT:

I'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.

Was it helpful?

Solution

You might have another and incomplete spring somewhere in parent classloader, most likely in {domaindir}/lib

OTHER TIPS

I had the same issue and after hunting for answers for almost a week, I found out that you need aopalliance.jar. This solved my problem.

Have you included Spring transaction jars in your classpath. The source for TransactionInterceptor.java contains reference to some of the org.springframework.transaction and org.springframework.transaction.support packages.

In your first snippet org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName() you are only loading the aopalliance class which has no dependencies on the Spring Transaction libraries.

In the second snippet you are loading TransactionInterceptor class and its dependencies (org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName()). The second exception you see after browser refresh makes sense compared to previous error (before browser refresh)

The first snippet is a independent class but the second snippet is a Spring class load which is a wrapper over aopalliance. Spring is trying to load its own dependencies (transaction related classes and aopalliance implementation).

java.lang.NoClassDefFoundError is thrown when one of its dependencies is not found at runtime although its found at compile time (dependency issues)

Try adding these dependencies and check if it resolves.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top