TomEE выбрасывает неверный жизненный цикл перехода

Я делаю основной рефакторинг веб-приложения с использованием мультимодульного подхода maven. На начальном этапе был только 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 НЕТ других зависимостей модуля.

Пом модуль персистентности имеет следующие зависимости:

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 упоминается в трассировке стека. Этот класс находится в persistence модуль. Что странно, это то, что он вообще не используется в export модуль, который я только что создал.

Вопрос дня: Каков наилучший подход к устранению этой проблемы?

Я думал о том, чтобы откатывать изменения один за другим и помещать классы обратно в основной модуль - но это может занять некоторое время...

Хотите знать, был ли подход серебряной пули для решения этой проблемы?

Приветствия.

2 ответа

Решение

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

Понимание этого потребовало, чтобы я поддерживал вещи по одному, пока вещи не прекратили ломаться.

Урок, полученный здесь: совершайте мало, часто совершайте.

Я бы открыл ваш артефакт и посмотрел бы 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

Другие вопросы по тегам