【问题标题】:EAR vs separate EJB + WAREAR 与单独的 EJB + WAR
【发布时间】:2011-10-21 13:36:42
【问题描述】:

将应用程序部署为 EAR(带有 1 个 EJB 和 1 个 WAR 模块)与单独的模块有什么区别?我想使用 GlassFish 3 Web 配置文件,但它不支持 EAR 存档。我可以简单地将 EJB 和 WAR 用作单独的模块吗?还有其他选择吗?

【问题讨论】:

    标签: java jakarta-ee war java-ee-6 ear


    【解决方案1】:

    3 种部署变体之间似乎有些混淆:

    1. 包含 EJB 和 WEB 模块的 EAR
    2. 部署单独的 EJB 模块和单独的 WEB 模块
    3. 部署包含 EJB 类或 EJB jar 的 WEB 模块。

    在第一种情况下,逻辑上您有一个应用程序,但一个应用程序分为两层。 WEB 模块与EJB 模块是隔离的,因为它可以使用EJB 模块中的类,但EJB 模块不能使用WEB 模块中的类。由于它是单个应用程序,因此可以使用对 EJB bean 的本地访问,并且 EJB bean 的注入按预期工作。

    在第二种情况下(您似乎在问题中提到了这种情况),没有逻辑上的单个应用程序,而是两个独立的模块。它们确实在同一个 JVM 中运行,但 Java EE 官方不允许使用本地访问,而必须使用远程访问(尽管实际上本地访问通常仍然有效)。此外,在 Web 模块中的 bean 中注入 EJB bean 不能直接使用简单的 @EJB 注释,而是必须使用指定全局 JNDI 名称的 lookup 属性。

    最后,第三种情况(您似乎没有提到,但 'home' 提到了)与第一种情况有点相似,但在这种情况下没有分层和隔离。 EJB bean 可以直接从 Web 模块的其余部分访问所有类。

    网络配置文件仅支持最后一种部署情况。不支持 EAR 和独立 EJB 部署。

    【讨论】:

    • 谢谢,这让我明白了很多。所以我应该去完整的配置文件,因为在我的项目中将有 3 个战争模块与 1 个 ejb 通信。
    • 第一种情况,EJB模块能否像第二种情况一样,使用lookup属性访问WEB模块?
    • 是否可以为 ejb 模块定义 context-root ?为什么 ejb module 中的 websocket 不可访问,但 war module 中的 war module 可访问?!!!有什么解决办法吗?
    【解决方案2】:

    将应用程序部署为 ear(带有 1 个 ejb 和 1 个 war 模块)与单独的模块有什么区别?

    不是一个完整的列表:在 EAR 中,您也可以定义 Utility JAR,它们位于例如EAR/lib 并且可以被 WARsEJB JARs 重用。 EAR 文件通常提供专有的部署功能,例如在 WebSphere 中,您可以指定 DataSource 详细信息,因此您不必使用管理实用程序定义 DataSource(和 JDBC 驱动程序)。

    因为我想使用 Glassfish 3 网络配置文件,但它不支持耳朵存档。我可以简单地使用 ejb 和 war 作为单独的模块吗?还有其他选择吗?

    是的,Web 配置文件规范明确允许您将轻量级 EJB 版本部署为WAR 的一部分。只需将 EJB JAR 放在 WARs WEB-INF/lib 中。此链接提供了功能比较(网络配置文件与成熟):http://glassfish.java.net/downloads/v3-final.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多