2016-10-05 4 views
0

Я занимаюсь крупным рефактором веб-приложения с использованием мультимодульного подхода maven. На ходу был только 1 модуль. Я медленно разрывал функциональность и создавал цепочку зависимостей, от которой зависит основной модуль.TomEE throws Недействительный переход на жизненный цикл

Другая необходимая информация стоит упомянуть: Мы используем следующее:

  • 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 

Основной модуль имеет следующие зависимости:

common 
persistence 
export 

Память родительского модуля определяет порядок сборки REACTOR следующим образом:

common 
persistence 
export 
main 

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

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

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

Удивление если есть пуля подход серебра к разрешению этого?

Cheers.

ответ

0

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

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

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

0

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

+0

К сожалению, файл TaskDataAccessServices.class присутствует в папке/WEB-INF/lib файла JAR с сохранением в взорванной WAR. Хорошая идея, хотя ... Это было бы слишком легко! :) –

+0

Удивительный, это хороший первый шаг. Проблема, вероятно, в инициализации этого класса, то ... возможно, попробуйте некоторые из вещей здесь: http://stackoverflow.com/questions/1401111/noclassdeffounderror-could-not-initialize-class-error Также убедитесь, не запускается байт-код java8 в java7 и т. д. –