【问题标题】:Application run well from eclipse, but fails to start, when it is deployed manually应用程序在 Eclipse 中运行良好,但在手动部署时无法启动
【发布时间】:2011-04-12 14:46:13
【问题描述】:

我有一个使用 SpringFramework3.0.3.RELEASE 的 Web 应用程序,在 Eclipse 中使用 m2eclipse 插件开发并部署到 Tomcat6.0.26 中。我可以从 Eclipse 运行它,但是当将目标 WAR 复制到相同的 tomcat 实例(首先删除 WTP webapp)并重新启动时,我看到以下异常:

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

我检查过,唯一的 org.apache.log4j.Logger.class 文件位于我的应用程序的 log4j-1.2.14.jar 中。 LogManager 存在于同一个包中,但报告为丢失。我的 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">
 <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>

infra 项目的另一个 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">
 <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>

有人知道问题出在哪里以及如何解决吗?

【问题讨论】:

    标签: eclipse spring maven-2 tomcat maven


    【解决方案1】:

    log4j 属性文件是否在您的应用程序类路径中? LogManager 可能会将其用作静态资源,如果丢失则不会初始化。

    【讨论】:

    • 我不认为这是原因,不提供log4j.properties 不会破坏应用程序。
    • 是的,它存在于我的应用程序的 WEB-INF/classes/ 中。此外,报告的异常是 NoClassDefFoundError
    【解决方案2】:
    NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
    

    此跟踪表明org.apache.log4j.LogManagerstatic 初始化块中存在问题。

    我没有完整的解释,但我会首先清理你的依赖项,它们有点混乱:

    • 为什么会有多个版本的 Hibernate JAR(3.5.0-Final 和 3.5.1-Final)。你应该让它们收敛。
    • Hibernate 使用 SLF4J,为什么你没有任何 log4j 绑定?
    • Spring 使用 commons-logging,我会将其配置为使用 SLF4J,以避免任何冲突和潜在的类加载问题。请参阅Logging Dependencies in Spring 了解完整说明。

    最后一点是 IMO 最重要的。

    【讨论】:

    • 感谢您的回答 CustomHibernateListener 保存审计跟踪并检查用户执行操作的权限。它在我的 applicationContext.xml 中的 sessionFactory bean 中声明:
    • class="com.sintecmedia.listener.CustomHibernateListener" / --> 如您所见,我已经在问题出现后对其进行了评论,但是现在我遇到了其他类的相同异常.如果我在 pom.xml 中将 Spring 定义为依赖项,Maven2 应该为 Spring 项目带来依赖项。但是我知道它会发生,只有在 spring jar 的 pom.xml 中定义了所有依赖项并且错误可能在那里发生。所以,我已经尝试添加 org.slf4j:slf4j-api:1.6.1 和 org:slf4j-log4j12:1.6.1,因为我已经在其他工作正常的项目中使用它。它没有帮助。
    • 你说得对,hibernate jars 版本不收敛。但是,我刚刚修复它并没有帮助。
    • 我读过“在 Spring 中记录依赖关系”。现在我明白为什么不包括 slf4j - 它是可选的。但我看到推荐的方法是排除 commons-logging,如果你使用 slf4j 和 log4j。我刚刚完成,它解决了我的问题
    • 我仍然不明白为什么问题只出在手动部署上,而如果 webapp 从 Eclipse 运行就不会发生?
    【解决方案3】:

    Pascal 的答案包含指向有用的“Logging Dependencies in Spring”文章的链接。它描述了如何覆盖旧的 commons-logging jar 并使用 slf4j 或 log4j。问题是 log4j 与 commons-logging 冲突。将它从 spring-context 的 maven 依赖项中排除,解决了这个问题。但是,我仍然不明白为什么问题仅出在手动部署上,而如果 webapp 从 Eclipse 运行就不会发生?

    【讨论】:

    • 抱歉错误报告问题并没有消失,异常消息只是从控制台移动到日志文件。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多