2016-03-12 33 views
0

В настоящее время я разрабатываю прототип, основанный на Java EE 7. Maven используется для управления зависимостями и плагина maven-ear-plug-а для окончательной сборки EAR. Последний затем развертывается на сервере приложений wildfly 10.0.Загрузка класса в модуле EJB, упакованном в EAR

Структура проекта следующим образом (упрощенно):

  • Контроллер-апи
  • Контроллер-осущ
  • модель-апи
  • модель-осущ
  • системы родитель (специалист родитель пакет)
  • система-ухо (для генерации уха)
  • view-webapp

EAR состоит из двух модулей ejb3 «control-impl» и «model-impl», а также веб-приложения «view-webapp». Maven-ухо-плагин настроен соответствующим образом:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-ear-plugin</artifactId> 
    <configuration> 
     <defaultLibBundleDir>lib</defaultLibBundleDir> 
     <generatedDescriptorLocation>META-INF</generatedDescriptorLocation> 
     <modules> 
      <ejbModule> 
       <groupId>com.domain.abc</groupId> 
       <artifactId>model-impl</artifactId> 
      </ejbModule> 
      <ejbModule> 
       <groupId>com.domain.abc</groupId> 
       <artifactId>controler-impl</artifactId> 
      </ejbModule> 
      <webModule> 
       <groupId>com.domain.abc</groupId> 
       <artifactId>view-webapp</artifactId> 
       <contextRoot>/myapp</contextRoot> 
      </webModule> 
     </modules> 
    </configuration> 
</plugin> 

До сих пор все работает хорошо, и прототип уже в приличном состоянии.

Однако, я столкнулся с проблемой в течение нескольких дней я не могу справиться с:

В Controler-осущий, я хочу использовать отражения (org.reflections) для определения классов, которые были обогащены с конкретной аннотацией , Следовательно, я добавил соответствующую зависимость, и отражения jar-0.9.10.jar правильно сохранены в папке lib EAR.

Но во время выполнения я всегда сталкиваюсь с классом ClassNotFoundException, показывающим, что загрузчик классов в модуле ejb module-impl не может найти классы в reflections-0.9.10.jar. Для отладки я прошел иерархию загрузчика классов и проверил, какие пакеты и классы доступны для них.

я обнаружил три загрузчики классов:

  1. ModuleClassLoader (родитель относится к 2)
  2. AppClassLoader (родитель относится к 3)
  3. ExtClassLoader (родитель нуль)

Ни один из них могут получить доступ к классам в reflections-0.9.10.jar, хранящимся в центральной папке EAR lib. Это странно, поскольку я ожидал, что эта папка ключа будет доступна всем модулям ушей.

Конечно, я искал существующие решения в Интернете. Например, я нашел следующую статью, объясняющую иерархию/разделение загрузчика классов более подробно.

Packaging EJB 3 Applications - Developer.com

Исходя из таблицы 2 в этой статье, я предположил, что я должен добавить файл манифеста в модуле EJB. Конечно, я попробовал это, изменив конфигурацию плагина maven-ear или даже добавив модуль maven-ejb-plugin в модули. Но я всегда сталкивался с ошибкой «Class Path [...] в [...] не указывает на допустимый jar для ссылки на Class-Path», и основная проблема отсутствия ссылки на папку EAR lib все еще существует (см. таблицу stacktrace ниже).

Я полагаю, что мне, скорее всего, придется настроить плагин maven-ear-plug-and/or maven-ejb-plugin (что бы это ни значило) - у кого-нибудь есть идея, как это сделать? Или я пропустил что-то важное?

Большое спасибо

Николя

Обновления в связи с reqests в комментариях

ПОМ из Controler-осущ

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.domain.abc</groupId> 
     <artifactId>prototype</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
     <relativePath>../system-parent/pom.xml</relativePath> 
    </parent> 

    <artifactId>controler-impl</artifactId> 
    <packaging>jar</packaging> 
    <name>Controler Implementation (EJB)</name> 

    <dependencies> 
     <!-- internal dependencies (provided by EAR) --> 
     <!-- [...] --> 
     <dependency> 
      <groupId>com.domain.abc</groupId> 
      <artifactId>controler-api</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.domain.abc</groupId> 
      <artifactId>model-api</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.domain.abc</groupId> 
      <artifactId>model-impl</artifactId> 
      <type>ejb</type> 
      <scope>provided</scope> 
     </dependency> 

     <!-- external dependencies (provided by EAR) --> 
     <!-- [...] --> 
     <dependency> 
      <groupId>org.reflections</groupId> 
      <artifactId>reflections</artifactId> 
      <scope>provided</scope> 
     </dependency> 

    <build> 
     <finalName>${project.artifactId}</finalName> 
    </build> 
</project> 

приложения .xml из EAR (сгенерированный Maven-плагин перепонки)

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE application PUBLIC 
    "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" 
    "http://java.sun.com/dtd/application_1_3.dtd"> 
<application> 
    <display-name>system-ear</display-name> 
    <description>...</description> 
    <module> 
    <ejb>model-impl-1.0.0-SNAPSHOT.jar</ejb> 
    </module> 
    <module> 
    <ejb>controler-impl-1.0.0-SNAPSHOT.jar</ejb> 
    </module> 
    <module> 
    <web> 
     <web-uri>view-webapp-1.0.0-SNAPSHOT.war</web-uri> 
     <context-root>/myapp</context-root> 
    </web> 
    </module> 
</application> 

Стек трассировки отрывок, показывающий, что отражения-0.9.10.jar не доступен

09:48:27,222 ERROR [org.jboss.as.ejb3.invocation] (ServerService Thread Pool -- 67) WFLYEJB0034: EJB Invocation failed on component AccessControlManagerImpl for method public abstract org.apache.shiro.web.env.WebEnvironment com.domain.abc.controler.main.api.security.AccessControlManager.getPermssions(): javax.ejb.EJBException: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:187) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:277) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:327) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:43) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) 
    at org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:110) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:66) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) 
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636) 
    at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) 
    at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
    at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:195) 
    at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:185) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
    at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:73) 
    at com.domain.abc.controler.main.api.security.AccessControlManager$$$view4.getWebEnvironment(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:436) 
    at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:127) 
    at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 
    at com.domain.abc.controler.main.impl.security.AccessControlManager$2108109816$Proxy$_$$_Weld$EnterpriseProxy$.getWebEnvironment(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 
    at org.jboss.weld.proxies.AccessControlManager$2108109816$Proxy$_$$_WeldClientProxy.getWebEnvironment(Unknown Source) 
    at com.domain.abc.view.frontend.webapp.security.CustomViewEnvLoaderListener.createEnvironment(CustomViewEnvLoaderListener.java:23) 
    at org.apache.shiro.web.env.EnvironmentLoader.initEnvironment(EnvironmentLoader.java:133) 
    at org.apache.shiro.web.env.EnvironmentLoaderListener.contextInitialized(EnvironmentLoaderListener.java:58) 
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187) 
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:198) 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100) 
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at org.jboss.threads.JBossThread.run(JBossThread.java:320) 
Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance 
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163) 
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:134) 
    at org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:88) 
    at org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:124) 
    at org.jboss.as.ejb3.component.singleton.SingletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:48) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275) 
    ... 63 more 
Caused by: javax.ejb.EJBException: WFLYEJB0442: Unexpected Error 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:184) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:277) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:344) 
    at org.jboss.as.ejb3.tx.LifecycleCMTTxInterceptor.processInvocation(LifecycleCMTTxInterceptor.java:66) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.weld.injection.WeldInjectionContextInterceptor.processInvocation(WeldInjectionContextInterceptor.java:43) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) 
    at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161) 
    ... 69 more 
Caused by: java.lang.NoClassDefFoundError: org/reflections/Configuration 
    at com.domain.abc.controler.main.impl.security.AccessControlManagerImpl.postConstruct(AccessControlManagerImpl.java:71) 
    at sun.reflect.GeneratedMethodAccessor313.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.jboss.as.ee.component.ManagedReferenceLifecycleMethodInterceptor.processInvocation(ManagedReferenceLifecycleMethodInterceptor.java:96) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doLifecycleInterception(Jsr299BindingsInterceptor.java:114) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:103) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) 
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:73) 
    at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.weld.injection.WeldInjectionInterceptor.processInvocation(WeldInjectionInterceptor.java:53) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:28) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.weld.ejb.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:100) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275) 
    ... 85 more 
Caused by: java.lang.ClassNotFoundException: org.reflections.Configuration from [Module "deployment.prototype.ear.controler-impl-1.0.0-SNAPSHOT.jar:main" from Service Module Loader] 
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351) 
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93) 
    ... 109 more 
+0

Можете ли вы разместить свой application.xml и stacktrace? – highstakes

+0

Не можете обновить ваш вопрос с помощью * pom.xml * файла модуля, который использует ваши * reflections-0.9.10.jar *? – aribeiro

+0

Кажется, что проблема может возникнуть из ** предоставленного ** в зависимости от вашего * размышления * от модуля * controler-impl *. У вас также есть зависимость * размышлений *, заявленная в вашем EAR? – aribeiro

ответ

0

Похоже, что вопрос результаты предоставлены на ваших отражениях зависимость контролер-имп. модуль.

Имея зависимость как предоставленную, вы не привязывали ее к пути класса вашего JAR, хотя он был извлечен и помещен в вашу папку EAR/lib.

Вы должны удалить зависимость от вашего EAR pom.xml файла, а также удалить при условии ключевого слова из ваших отражений зависимости -контроллер осущий модуля.

Выполнение этого требует, чтобы Maven привязывал зависимость к вашему пути JAR и по транзитивности помещал его в папку EAR/lib.