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 общего модуля не имеет НИКАКИХ зависимостей от других модулей.

Pom модуля сохраняемости имеет следующие зависимости:

common

Pom модуля экспорта имеет следующие зависимости:

common
persistence

Pom основного модуля имеет следующие зависимости:

common
persistence
export

Pom родительского модуля определяет порядок сборки РЕАКТОРА следующим образом:

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, который я только что создал.

Вопрос дня: как лучше всего решить эту проблему?

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

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

Ваше здоровье.


person ivan_drago    schedule 05.10.2016    source источник


Ответы (2)


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

person Jonathan S. Fisher    schedule 06.10.2016
comment
К сожалению, файл TaskDataAccessServices.class находится в папке / WEB-INF / lib файла сохраняемости JAR в развернутой WAR. Но хорошая идея ... Это было бы слишком просто! :) - person ivan_drago; 06.10.2016
comment
Замечательно, это хороший первый шаг. Проблема, вероятно, в инициализации этого класса ... может быть, попробуйте кое-что здесь: stackoverflow.com/questions/1401111/ Также убедитесь, что вы не используете байт-код java8 в java7 и т. д. - person Jonathan S. Fisher; 07.10.2016

В файле 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>

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

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

person ivan_drago    schedule 07.10.2016