【问题标题】:TomEE throws An invalid Lifecycle transitionTomEE 抛出无效的生命周期转换
【发布时间】:2016-10-05 20:42:40
【问题描述】:

我正在使用 maven 多模块方法对 Web 应用程序进行重大重构。 一开始只有 1 个模块。 我一直在慢慢分解功能并创建主模块所依赖的依赖链。

其他值得一提的相关信息: 我们正在使用以下内容:

  • TomEE (Apache TomEE-JAXRS 1.5.1)
  • OpenEJB
  • Apache Maven
  • JDK 1.7.x

目前我的网络应用程序结构如下:

parent
  pom.xml  
     |
     common
       pom.xml
     |
     persistence
       pom.xml
     | 
     export
       pom.xml
     |
     main
       pom.xml

所以... 通用模块的 pom 没有其他模块依赖。

持久化模块的pom有以下依赖:

common

导出模块的pom有以下依赖:

common
persistence

主模块的pom有以下依赖:

common
persistence
export

父模块的pom指定REACTOR Build Order如下:

common
persistence
export
main

在创建export 模块之前,一切都可以正常构建和部署;但是,既然我已经从 main 中分解出其他内容并将其放入导出模块中,构建就很好了,但是当我部署生成的 WAR 文件时,启动时会显示以下堆栈跟踪:

SEVERE: ContainerBase.removeChild: destroy:
org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_destroy]) for component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myapp]] in state [STARTING_PREP]
    at org.apache.catalina.util.LifecycleBase.invalidTransition(LifecycleBase.java:409)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:299)
    at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:1041)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.undeploy(TomcatWebAppBuilder.java:1167)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.undeploy(TomcatWebAppBuilder.java:1148)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.undeployWebApps(TomcatWebAppBuilder.java:635)
    at org.apache.openejb.assembler.classic.Assembler.destroyApplication(Assembler.java:1275)
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:955)
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:537)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:982)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:901)
    at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:118)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1655)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

Oct 05, 2016 12:51:23 PM org.apache.tomee.catalina.TomcatWebAppBuilder startInternal
SEVERE: Unable to deploy collapsed ear in war    
StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myapp]     org.apache.openejb.OpenEJBException: Creating application failed:
C:\java\servers\apache-tomee-jaxrs-1.5.1\webapps\act-cde: Error building bean 'TaskDataAccessServices'.  Exception: class java.lang.NoClassDefFoundError:     
Could not initialize class   com.myapp.cde.persistence.ejb.TaskDataAccessServices: Could not initialize class com.myapp.cde.persistence.ejb.TaskDataAccessServices
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:959)
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:537)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:982)
    at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:901)
    at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:118)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1655)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

Caused by: org.apache.openejb.OpenEJBException: Error building bean 'TaskDataAccessServices'.  Exception: class java.lang.NoClassDefFoundError:  
Could not initialize class  
com.myapp.cde.persistence.ejb.TaskDataAccessServices: Could not   
initialize class  
com.myapp.cde.persistence.ejb.TaskDataAccessServices
    at    org.apache.openejb.assembler.classic.EjbJarBuilder.build(EjbJarBuilder.java:81)
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:713)
    ... 18 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.myapp.cde.persistence.ejb.TaskDataAccessServices
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)
    at org.apache.openejb.assembler.classic.EnterpriseBeanBuilder.load(EnterpriseBeanBuilder.java:425)
    at org.apache.openejb.assembler.classic.EnterpriseBeanBuilder.loadClass(EnterpriseBeanBuilder.java:405)
    at org.apache.openejb.assembler.classic.EnterpriseBeanBuilder.build(EnterpriseBeanBuilder.java:81)
    at org.apache.openejb.assembler.classic.EjbJarBuilder.build(EjbJarBuilder.java:66)
    ... 19 more

注意堆栈跟踪中提到的TaskDataAccessServices。该类位于persistence 模块中。奇怪的是,我刚刚创建的export 模块中根本没有使用它。

今日问题:调试此问题的最佳方法是什么?

我曾考虑过逐个撤销更改并将类放回主模块 --- 但这可能需要一段时间......

想知道是否有解决此问题的灵丹妙药?

干杯。

【问题讨论】:

    标签: java maven apache-tomee multi-module openejb


    【解决方案1】:

    我会打开你的工件,看看com.myapp.cde.persistence.ejb.TaskDataAccessServices 是否真的存在于其中。

    这就是这个堆栈跟踪告诉你的:

    Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.myapp.cde.persistence.ejb.TaskDataAccessServices at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:274) at org.apache.openejb.assembler.classic.EnterpriseBeanBuilder.load(EnterpriseBeanBuilder.java:425) at org.apache.openejb.assembler.classic.EnterpriseBeanBuilder.loadClass(EnterpriseBeanBuilder.java:405) at org.apache.openejb.assembler.classic.EnterpriseBeanBuilder.build(EnterpriseBeanBuilder.java:81) at org.apache.openejb.assembler.classic.EjbJarBuilder.build(EjbJarBuilder.java:66) ... 19 more

    【讨论】:

    • 不幸的是,TaskDataAccessServices.class 文件存在于分解的 WAR 中持久性 JAR 文件的 /WEB-INF/lib 文件夹中。不过好主意……那太容易了! :)
    • 太棒了,这是一个很好的第一步。问题可能出在该类的初始化中......也许在这里尝试一些事情:stackoverflow.com/questions/1401111/… 还要确保你没有在 java7 中运行 java8 字节码等
    【解决方案2】:

    main pom.xml 文件中,我有以下<dependency>

    <dependency>
       <groupId>net.sf.ehcache</groupId>
       <artifactId>ehcache</artifactId>
       <version>2.8.3</version>
    </dependency>
    

    export pom.xml 文件中,我有以下&lt;dependency&gt;

    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>1.7.21</version>
     </dependency>
    

    我几乎不知道ehcache 有它自己的slf4j 依赖项。

    ehcache &lt;dependency&gt; 更改为以下为我解决的问题:

    <dependency>
       <groupId>net.sf.ehcache</groupId>
       <artifactId>ehcache</artifactId>
       <version>2.8.3</version>
       <exclusions>
          <exclusion>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
          </exclusion>
       </exclusions>
    </dependency>
    

    解决这个问题需要我一次又一次地退出,直到事情停止破裂。

    在这里学到的教训:小提交,经常提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多