TomEE 抛出无效的生命周期转换

TomEE throws An invalid Lifecycle transition

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

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

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

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 构建顺序如下:

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。此 class 位于 persistence 模块中。奇怪的是,我刚刚创建的 export 模块中根本没有使用它。

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

我考虑过一项一项地撤消更改并将 classes 放回主模块中 --- 但这可能需要一段时间...

想知道是否有灵丹妙药来解决这个问题?

干杯。

我会打开你的神器,看看里面是否真的有 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

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

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

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

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

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

ehcache <dependency> 更改为以下为我解决的问题:

<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>

要弄清楚这一点,我需要一次一个地解决问题,直到问题停止为止。

这里的经验教训:少做,多做。