4

I have a standalone spring app that contains mainly aspecj aspects and few other spring managed beans and bundled in a jar with maven-assembly plugin with all the spring dependencies bundled inside the jar and added to weblogic classpath.

the goal is to have he aspects inside the library woven into all the running applications inside weblogic in run time using aspectJ agent.

The problem is that when I add my jar file in the classpath and restart the server I get ClassNotFoundException when the existing web app is deployed.

I know it is not a jar file not in the lib folder, since the app deploys fine without my jar file in classpath.

Note: I also get classNotFoundException when I just drop the spring jar files in the domain/lib folder.

Can you shade some light on why the running applications are impacted by my spring based library?

Please see stacktrace below: i m pretty sure javax.validation.ValidatorFactory is in the validation-api inside the WEB-INF\lib folder. as i only get this exception when I add my custom jar file to weblogic classpath.

Caused By: org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean] for bean with name 'jsr303Validator' defined in ServletContext resource [/WEB-INF/config/webmvc-config.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: javax/validation/ValidatorFactory
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1272)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:578)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1338)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:356)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:335)
at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:187)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:895)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
at org.s

Caused By: java.lang.ClassNotFoundException: javax.validation.ValidatorFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java

Here is the dependency tree of my WAR file.

       [INFO] [dependency:tree {execution: default-cli}]
    [INFO] com.company.project:eCom4jWeb:war:1.0.0-SNAPSHOT
    [INFO] +- com.company.project:eCom4jCore:jar:1.0.0-SNAPSHOT:compile
    [INFO] |  +- org.springframework:spring-jdbc:jar:3.1.2.RELEASE:compile
    [INFO] |  +- org.hsqldb:com.springsource.org.hsqldb:jar:1.8.0.9:runtime
    [INFO] |  +- mysql:mysql-connector-java:jar:5.1.9:compile
    [INFO] |  +- org.hibernate:com.springsource.org.hibernate:jar:3.3.2.GA:compile
    [INFO] |  |  +- net.sourceforge.cglib:com.springsource.net.sf.cglib:jar:2.2.0:compile
[INFO] |  |  +- org.antlr:com.springsource.antlr:jar:2.7.6:compile
[INFO] |  |  +- org.apache.commons:com.springsource.org.apache.commons.collections:jar:3.2.1:compile
[INFO] |  |  +- org.dom4j:com.springsource.org.dom4j:jar:1.6.1:compile
[INFO] |  |  +- org.jboss.javassist:com.springsource.javassist:jar:3.9.0.GA:compile
[INFO] |  |  \- org.objectweb.asm:com.springsource.org.objectweb.asm:jar:1.5.3:compile
[INFO] |  +- org.hibernate:com.springsource.org.hibernate.annotations:jar:3.4.0.GA:compile
[INFO] |  |  \- org.hibernate:com.springsource.org.hibernate.annotations.common:jar:3.3.0.ga:compile
[INFO] |  +- org.hibernate:hibernate-validator:jar:4.2.0.Final:compile
[INFO] |  |  +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] |  |  \- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] |  +- javax.transaction:com.springsource.javax.transaction:jar:1.1.0:compile
[INFO] |  +- commons-beanutils:commons-beanutils:jar:1.8.3:compile
[INFO] |  +- net.sf.dozer:dozer:jar:5.3.1:compile
[INFO] |  \- org.apache.xmlbeans:xmlbeans:jar:2.4.0:runtime
[INFO] |     \- stax:stax-api:jar:1.0.1:runtime
[INFO] +- com.company.project:eCom4jWS:jar:1.0.0-SNAPSHOT:compile
[INFO] |  +- com.company.project:eCom4jRemixDomain:jar:1.0.0-SNAPSHOT:compile
[INFO] |  |  \- org.jvnet.jaxb2_commons:jaxb2-basics-runtime:jar:0.6.2:compile
[INFO] |  \- org.springframework:spring-oxm:jar:3.1.2.RELEASE:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] +- org.springframework.security:spring-security-web:jar:3.1.2.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework.security:spring-security-taglibs:jar:3.1.2.RELEASE:compile
[INFO] |  \- org.springframework.security:spring-security-acl:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-webmvc:jar:3.1.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-asm:jar:3.1.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-context-support:jar:3.1.2.RELEASE:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- org.springframework:spring-beans:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework.webflow:spring-binding:jar:2.2.1.RELEASE:compile
[INFO] +- org.springframework.webflow:spring-js:jar:2.2.1.RELEASE:compile
[INFO] |  \- org.springframework.webflow:spring-js-resources:jar:2.2.1.RELEASE:compile
[INFO] +- org.springframework.webflow:spring-webflow:jar:2.2.1.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-config:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-core:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-tx:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-web:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:3.1.2.RELEASE:compile
[INFO] +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-core:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-orm:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:3.1.2.RELEASE:compile
[INFO] +- javax.el:el-api:jar:1.0:provided
[INFO] +- org.jboss.el:com.springsource.org.jboss.el:jar:2.0.0.GA:compile
[INFO] +- org.apache.tiles:tiles-core:jar:2.1.4:compile
[INFO] |  +- commons-digester:commons-digester:jar:1.8.1:compile
[INFO] |  \- commons-logging:commons-logging-api:jar:1.1:compile
[INFO] +- org.apache.tiles:tiles-jsp:jar:2.1.4:compile
[INFO] +- org.apache.tiles:tiles-api:jar:2.1.4:compile
[INFO] +- org.apache.tiles:tiles-servlet:jar:2.1.4:compile
[INFO] +- org.springframework:spring-test:jar:3.1.2.RELEASE:test
[INFO] +- org.springframework:spring-expression:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-test-mvc:jar:1.0.0.BUILD-SNAPSHOT:test
[INFO] +- org.powermock:powermock-module-junit4:jar:1.4.12:test
[INFO] |  \- org.powermock:powermock-module-junit4-common:jar:1.4.12:test
[INFO] |     +- org.powermock:powermock-core:jar:1.4.12:test
[INFO] |     |  \- org.javassist:javassist:jar:3.16.1-GA:test
[INFO] |     \- org.powermock:powermock-reflect:jar:1.4.12:test
[INFO] +- org.powermock:powermock-api-easymock:jar:1.4.12:test
[INFO] |  \- org.powermock:powermock-api-support:jar:1.4.12:test
[INFO] +- org.codehaus.jackson:jackson-mapper-asl:jar:1.5.3:compile
[INFO] |  \- org.codehaus.jackson:jackson-core-asl:jar:1.5.3:compile
[INFO] +- com.jayway.jsonpath:json-path:jar:0.8.1:test
[INFO] |  \- net.minidev:json-smart:jar:1.1.1:test
[INFO] +- org.aspectj:com.springsource.org.aspectj.weaver:jar:1.6.8.RELEASE:compile
[INFO] +- org.slf4j:com.springsource.slf4j.api:jar:1.5.6:compile
[INFO] +- org.slf4j:com.springsource.slf4j.org.apache.commons.logging:jar:1.5.6:runtime
[INFO] +- org.slf4j:com.springsource.slf4j.log4j:jar:1.5.6:runtime
[INFO] +- org.apache.log4j:com.springsource.org.apache.log4j:jar:1.2.15:compile
[INFO] +- org.apache.commons:com.springsource.org.apache.commons.dbcp:jar:1.2.2.osgi:runtime
[INFO] +- org.apache.commons:com.springsource.org.apache.commons.pool:jar:1.5.3:runtime
[INFO] +- org.hamcrest:hamcrest-all:jar:1.3:compile
[INFO] +- junit:junit:jar:4.8.1:test (scope not updated to compile)
[INFO] +- org.easymock:easymock:jar:3.1:test
[INFO] |  +- cglib:cglib-nodep:jar:2.2.2:test
[INFO] |  \- org.objenesis:objenesis:jar:1.2:test
[INFO] +- commons-lang:commons-lang:jar:2.6:compile
[INFO] +- org.apache.struts:struts2-core:jar:2.2.1:compile
[INFO] |  +- org.apache.struts.xwork:xwork-core:jar:2.2.1:compile
[INFO] |  +- org.freemarker:freemarker:jar:2.3.16:compile
[INFO] |  +- ognl:ognl:jar:3.0:compile
[INFO] |  +- commons-fileupload:commons-fileupload:jar:1.2.1:compile
[INFO] |  +- commons-io:commons-io:jar:1.3.2:compile
[INFO] |  \- com.sun:tools:jar:1.5.0:system
[INFO] +- org.apache.struts:struts2-tiles-plugin:jar:2.2.1:compile
[INFO] +- org.apache.struts:struts2-spring-plugin:jar:2.2.1:compile
[INFO] +- javax.mail:mail:jar:1.4:compile
[INFO] |  \- javax.activation:activation:jar:1.1:compile
[INFO] \- net.tanesha.recaptcha4j:recaptcha4j:jar:0.0.7:compile
[INFO] -------

Thanks

Sammy
  • 4,538
  • 8
  • 33
  • 52
  • Can you provide a stack trace? Its possible you a missing a dependency for Spring. – CodeChimp May 22 '13 at 13:55
  • stacktrace added. i m sure the missing library is inside the WEB-INF\lib and I only get this exception when I add my custom jar file to classpath. – Sammy May 22 '13 at 14:03
  • It looks like you are missing javax.validation.ValidationFactory. Can you confirm that is in your classpath somewhere? – CodeChimp May 22 '13 at 14:23
  • yes, i m sure it is there, as I can see the validation-api jar file in my lib folder and I get the exception only when I add my other spring project ( jar file) in the classpath – Sammy May 22 '13 at 14:37
  • Just a guess - maybe you have more than one jar in your classpath that contains the ValidatorFactory class, so it has no idea which one to use. – Display Name is missing May 22 '13 at 16:27
  • Is it the correct version? Is your AOP code using the validation stuff at all? I agree with @better_use_mkstemp, it may be that you have two versions and it's either confused or using the wrong one. – CodeChimp May 22 '13 at 17:26
  • I m not using the validation stuff at all in my AOP code. the only thing I can think of is that one of the webapp have the validation-api as a dependency of Hibernate-validator. so the validation-api contains javax.validation.ValidationFactory and I think the Java EE library also have javax.validation.ValidationFactory class. but this exception only happen when I add my AOP jar file to classpath. – Sammy May 22 '13 at 17:58
  • You have "java ee library" jar in WAR WEB-INF/lib ? First remove it from there with "provided" scope in your maven project. Please provide the list of jar files in WEB-INF/lib. – Yves Martin May 31 '13 at 20:43
  • I have added the dependency tree. there is no java-ee jars – Sammy May 31 '13 at 21:58
  • @Sammy Did you try to add the validation-api jar to the weblogic classpath? – fmodos Jun 04 '13 at 21:58

3 Answers3

0

If you are using maven to build your jar, try to build your jar file with the dependencies embedded and test it, the below link can help you to do so:

How can I create an executable JAR with dependencies using Maven?

Community
  • 1
  • 1
Bassem Reda Zohdy
  • 12,662
  • 3
  • 33
  • 39
0

The dependency tree shows:

  • two versions of commons-logging: 1.1 and 1.1.1
  • two versions of slf4j: 1.5.6 and 1.6.1
  • javax.transaction has scoped compiled instead of provided
  • various versions of Hibernate artifacts from different sources org.hibernate:com.springsource.org.hibernate:jar:3.3.2.GA:compile org.hibernate:com.springsource.org.hibernate.annotations:jar:3.4.0.GA:compile org.hibernate:hibernate-validator:jar:4.2.0.Final:compile

As ClassLoader loads resources without any determined or predefined order, adding a jar file may have changed this order and class conflicts are now visible - either inside the EAR/WAR itself or between the application server and the application.

It is not obvious to point the conflict source with information provided but it is probably org.hibernate:hibernate-validator and you should align its version with core package, so 3.3.2.GA from com.springsource too.

To get the diagnostic clear, run WebLogic JVM with -verbose:class option and look at stderr output. The latest loaded resources before the failure and log of previously loaded related classes are the best clues to eliminate such a conflict created by packaging.

If conflict comes from a application server package and you cannot align to that same version, WebLogic allows you to set class loading filtering by package to force your own version to be loaded. Please refer to section Using a Filtering Classloader from classloading documentation.

Yves Martin
  • 10,217
  • 2
  • 38
  • 77
0

It sounds like a Jar Hell... If you have different versions of the same jar, your container only loads the first one... now, imagine if it loads version 5 of jar 1, and version 2 of the dependent jar 2 (but the correct was version 5 too)... and can get a big crash in your system... to prevent it, some container just don't load none versions, and give some messages like ClassNotFoundException.