【问题标题】:My ear is not able to find ejb module classes我的耳朵找不到 ejb 模块类
【发布时间】:2016-12-24 13:56:46
【问题描述】:

我是 EAR 新手。我开发了一个 web 模块和一个 ejb 模块,它们的功能相互依赖。为此,我试图在 EAR 中配置它们。我将 web 和 ejb 模块都映射到 EAR,并且可以看到 application.xml 为

  <display-name>EBS-ear</display-name>
  <module>
    <ejb>EBS-ejb.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>EBS-web.war</web-uri>
      <context-root>EBS-web</context-root>
    </web>
  </module>
</application>

但是当我尝试执行 EAR 时,我的服务器抛出异常

23:58:29,606 ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /EBS-web/: java.lang.NoClassDefFoundError: com/ebs/service/UserAuthorisationService
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getConstructor(Unknown Source)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:480)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:429)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:556)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:295)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:264)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:967)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:435)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:479)
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)
    at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)
    at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:84)
    at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:97)
    at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)
    at io.undertow.servlet.core.ManagedFilter.getFilter(ManagedFilter.java:66)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.jsp.JspFileHandler.handleRequest(JspFileHandler.java:32)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.ebs.service.UserAuthorisationService from [Module "deployment.EBS-web.war: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)
    ... 61 more

我从上面可以理解的是,EAR 无法定位 EJB 模块中存在的类,因此引发了异常。我正在使用 WildFLy 10 服务器和 Eclipse IDE。

【问题讨论】:

    标签: java eclipse jakarta-ee jboss


    【解决方案1】:

    EAR 文件只是各种企业模块(EJB jar、WAR 文件和常规 jar 文件)的容器,其中包含一些明确定义(但经常被误解)的规则,哪些类可以看到哪些。

    在大多数情况下,您会看到具有以下内部结构的 EAR 文件:

    EAR
     \-lib
     |  \- utilityA.jar
     |  \- utilityB.jar
     |  \- ...
     |- ejb-jarC.jar
     |- ejb-jarD.jar
     |- ...
     |- warE.jar
     |- warF.jar
     |- ...
    

    出于类可见性的目的,上面的 EAR 显示了五个模块:

    1. lib 模块
    2. ejb-jar1.jar
    3. ejb-jar2.jar
    4. war1.jar
    5. war2.jar

    地点:

    1. lib 模块中的所有 jar 都被认为在同一个模块中;
    2. 每个 WAR 文件中的所有 jar 和类都被认为在同一个模块中;
    3. 每个 ejb-jar 都是一个独立的模块。

    通常,每个模块都有自己的类加载器。

    现在,JBossAS/WildFly 稍微放宽了类可见性规则,以使开发人员的生活更简单(出于历史原因)。在这些服务器实现中,规则是:

    1. 每个 WAR 模块都可以看到它自己的类,每个 EJB jar 中的类以及 EAR/lib 目录中每个 jar 中的类
      • 它看不到其他 WAR 模块中的类;
    2. 每个 EJB 模块都可以看到它自己的类,其他 EJB 模块中的类以及 EAR/lib 目录下每个 jar 中的类;
      • 它看不到任何 WAR 模块中的类;
    3. EAR/lib 模块中的类只能互相看到:
      • 他们看不到任何 EJB 模块或WAR 模块中的类

    更严格的实现需要定义清单类路径条目,以使 EJB 模块对彼此和 WAR 模块可见。

    现在,鉴于以上所有情况,您的特定问题很可能是以下问题之一:

    1. lib 模块中的类试图访问 EJB 模块或 WAR 模块之一中的类 - 您是否将 struts2 jar 放在 EAR/lib 目录中?
    2. EJB 模块中的类试图访问 WAR 模块之一中的类

    说了这么多,你可以让你的生活更轻松,因为你使用的是 JavaEE 7 服务器。只需将包括 EJB 在内的所有内容打包到 WAR 文件中。您可能无法从构建和部署 EAR 中获得任何好处

    【讨论】:

    • 感谢您如此需要的解释。它对我理解 EAR 结构有很大帮助。但是我们真的需要将web模块和ejb模块中的所有jar都放入ear lib文件夹吗??
    • 只有web模块和ejb模块都需要共享的jar;一个 EJB 模块由一个 jar 组成 - 它没有自己的 jar
    • 好的。我知道了。它们应该放在 eatContent/lib/ ??
    • 是的 - 但请考虑我刚刚添加的结束语
    • 如果你知道的话,你也可以帮我提供一些学习材料来更详细地了解耳朵和战争结构。
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多