views:

122

answers:

3

I have web application using SpringFramework3.0.3.RELEASE, developed in Eclipse with m2eclipse plugin and deployed into Tomcat6.0.26. I can run it from Eclipse, but when copy target WAR int same tomcat instance ( removing WTP webapp first ) and restart I see following exception:

Sep 14, 2010 5:54:42 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 14, 2010 5:54:45 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'onboardSessionFactory' defined in class path resource [applicationContext.xml]: Cannot resolve reference to bean 'customListener' while setting bean property 'eventListeners' with key [TypedStringValue: value [pre-insert], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customListener' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedMap(BeanDefinitionValueResolver.java:383)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:161)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1317)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1076)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
 at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
 at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
 at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
 at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:905)
 at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:740)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:500)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customListener' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:955)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:901)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
 ... 41 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
 at org.apache.log4j.Logger.getLogger(Logger.java:117)
 at com.mycompany.listener.CustomHibernateListener.<clinit>(CustomHibernateListener.java:69)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
 at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
 at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:71)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:948)
 ... 49 more
Sep 14, 2010 5:54:50 PM org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext

I've checked and the only org.apache.log4j.Logger.class file is inside log4j-1.2.14.jar of my application. LogManager present in same package, but it is reported as missed. My pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.mycompany</groupId>
 <artifactId>mainProject</artifactId>
 <version>1.1.8</version>
 <packaging>war</packaging>

 <build>
  <sourceDirectory>src</sourceDirectory>  
  <plugins>           
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1</version>
    <configuration>
     <webXml>WebContent/WEB-INF/web.xml</webXml>
     <webResources>
      <resource> 
       <directory>src</directory>
       <targetPath>WEB-INF/classes</targetPath> 
       <excludes>
        <exclude>**/*.java</exclude> 
       </excludes> 
      </resource>
     </webResources>
     <warSourceDirectory>WebContent</warSourceDirectory>
    </configuration>
   </plugin>     

   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.1</version>    
   </plugin>

  </plugins>
 </build>
 <repositories>..</repositories>

 <dependencies>

  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <type>jar</type>
   <scope>provided</scope>
  </dependency>

  <dependency>
   <groupId>dom4j</groupId>
   <artifactId>dom4j</artifactId>
   <version>1.6.1</version>
   <type>jar</type>
  </dependency>

  <!-- Hibernate, Hibernate Search and dependencies -->
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-search</artifactId>
   <version>3.2.0.Final</version>
  </dependency>
  <dependency>
   <groupId>commons-dbcp</groupId>
   <artifactId>commons-dbcp</artifactId>
   <version>1.4</version>
  </dependency>
  <dependency>
   <groupId>org.apache.lucene</groupId>
   <artifactId>lucene-queryparser</artifactId>
   <version>2.9.2</version>
  </dependency>
  <dependency>
   <groupId>javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.8.0.GA</version>
  </dependency>
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-annotations</artifactId>
   <version>3.5.0-Final</version>
  </dependency>

  <!-- Spring Framework, Spring Security and dependencies -->
  <dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-core</artifactId>
   <version>3.0.3.RELEASE</version>
   <type>jar</type>
  </dependency>   
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>3.0.3.RELEASE</version>
   <type>jar</type>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>3.0.3.RELEASE</version>
   <type>jar</type>
  </dependency>  

  <!-- JUnit, JSFUnit and etc. -->
  <dependency>
   <groupId>org.jboss.jsfunit</groupId>
   <artifactId>jboss-jsfunit-core</artifactId>
   <version>1.3.0.Final</version>
  </dependency>

  <!--  JSF -->
  <dependency>
   <groupId>javax.faces</groupId>
   <artifactId>jsf-api</artifactId>
   <version>2.0.2-FCS</version>
  </dependency>
  <dependency>
   <groupId>javax.faces</groupId>
   <artifactId>jsf-impl</artifactId>
   <version>2.0.2-FCS</version>
  </dependency>

  <!-- PrimeFaces and dependencies -->
  <dependency>
   <groupId>org.primefaces</groupId>
   <artifactId>primefaces</artifactId>
   <version>2.1.RC1</version>
  </dependency>
  <dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.2.1</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>

  <!-- Sintecmedia infrastructure -->
  <dependency>
   <groupId>com.mycompany</groupId>
   <artifactId>rc-infra</artifactId>
   <version>1.2</version>
  </dependency>

 </dependencies>

</project>

Another pom.xml from infra project:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.mycompany/groupId>
 <artifactId>rc-infra</artifactId>
 <packaging>jar</packaging>
 <version>1.2</version>
 <name>infra</name>
 <description>Spring-Hibernate Infrastructure</description>

 <repositories>..</repositories>

 <build>
        <defaultGoal>install</defaultGoal>
        <sourceDirectory>src</sourceDirectory>
        <plugins>

            <!-- http://maven.apache.org/plugins/maven-clean-plugin/clean-mojo.html -->
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.1</version>
            </plugin>

            <!-- http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>                 
                    <source>1.5</source>
                    <target>1.5</target>
                    <showDeprecation>true</showDeprecation>
                    <compilerArgument>-Xlint:all</compilerArgument>
                </configuration>
            </plugin>

   <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-source-plugin</artifactId>
     <executions>
       <execution>
         <id>attach-sources</id>
         <goals>
           <goal>jar</goal>
         </goals>
       </execution>
     </executions>
   </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <workspace>${eclipse.workspace.dir}</workspace>
                </configuration>
            </plugin>

            <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-javadoc-plugin</artifactId>
             <version>2.7</version>
             <configuration>
              <outputDirectory>${eclipse.workspace.dir}/doc</outputDirectory>
              <sourcePath>${eclipse.workspace.dir}/src/main/java</sourcePath>
             </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>

     <dependency>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
         <version>1.2.14</version>
        </dependency>

  <!-- Hibernate dependencies -->
        <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>3.5.1-Final</version>
        </dependency>

        <!-- Spring dependencies -->               
        <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <version>3.0.3.RELEASE</version>
        </dependency>                     
        <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>3.0.3.RELEASE</version>
        </dependency>
        <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-tx</artifactId>
         <version>3.0.3.RELEASE</version>
        </dependency>

    </dependencies>

</project>

Is anybody know what is the problem and how to fix it?

A: 

Is the log4j property file on your app classpath? LogManager might use it as a static resource and doesn't initalize if it is missing.

david a.
I don't think this is the cause, not providing a `log4j.properties` doesn't break an application.
Pascal Thivent
Yes it exists in WEB-INF/classes/ of my application. Morever, the exception reported is NoClassDefFoundError
Igor Grinfeld
A: 
NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager

This trace indicates a problem in the static initialization block of org.apache.log4j.LogManager.

I don't have the full explanation but I would start by doing some clean up in your dependencies, they are a bit messy:

  • Why do you have several versions of Hibernate JARs (3.5.0-Final and 3.5.1-Final). You should make them converge.
  • Hibernate uses SLF4J, why don't you have any binding for log4j?
  • Spring uses commons-logging, I would configure it to use SLF4J also to avoid any conflicts and potential classloading problems. See Logging Dependencies in Spring for full explanations.

The last point is IMO the most important.

Pascal Thivent
Thank you for answer CustomHibernateListener saves audit trails and check user permissions to action performed. It declared in my applicationContext.xml, inside sessionFactory bean:
Igor Grinfeld
class="com.sintecmedia.listener.CustomHibernateListener" / -->As you can see, I've already commented it after the issue is appeared, but now I have the same exception from other classes.Maven2 should bring to project the dependencies for Spring, if I define Spring as dependency in pom.xml. However I know that it happens, only if all dependencies are defined in pom.xml of spring jars and mistake can occur there. So, I already tried to add org.slf4j:slf4j-api:1.6.1 and org:slf4j-log4j12:1.6.1, since I've use it in other project that works fine. It didn't help.
Igor Grinfeld
You are right, hibernate jars versions is not convergent. However, I've just fixed it and it didn't help.
Igor Grinfeld
I read 'Logging Dependencies in Spring'. Now I understand why slf4j is not included - its optional. But I see that recommended way is to exclude commons-logging, if you use slf4j and log4j. I just done it and it solves my issue
Igor Grinfeld
I still don't undersand why the issue was with manual deploy only and doesn't happened if the webapp is run from Eclipse?
Igor Grinfeld
@Igor Eclipse "builds" some kind of artificial classpath, you can get different behaviors inside and outside Eclipse (as you experimented).
Pascal Thivent
A: 

Pascal's answer contains a link to useful 'Logging Dependencies in Spring' article. It describes how to override old commons-logging jar and to use slf4j or log4j. The problem was that log4j conflicted with commons-logging. Excluding it from maven dependencies of spring-context, solved the issue. However, I still don't understand why the issue was with manual deploy only and doesn't happened if the webapp is run from Eclipse?

Igor Grinfeld
Sorry about wrong report the problem does not disappear, the exception message just move from console to log file.
Igor Grinfeld