【问题标题】:Java EE deployment issueJava EE 部署问题
【发布时间】:2014-05-24 10:21:12
【问题描述】:

我在部署 Java EE 应用程序时遇到了一些问题,可以参考一些建议。
我要部署 3 个组件:

  • 集成层(数据):POJO 和 CDI Bean - JAR 文件
  • 应用层 (BL):EJB、CDI Bean 和 POJO - JAR 文件
  • 表示层:Servlet 等 - WAR 文件

理想情况下,我希望能够在同一 Java EE 服务器中部署集成和应用层 JAR,但作为单独的 JAR(因为我可能希望稍后更改硬件配置并将它们分成两个不同的服务器在两台不同的机器上)。
问题是我无法让 CDI 注入从集成层 JAR 到应用层 JAR 工作。服务器说(而且可能是正确的)无法解决注入问题。

到目前为止,我想出了这些可能的解决方案:

  • 将两个 JAR 打包到一个 EAR 文件中(也可以放入 WAR 中......),然后部署它
  • 在不同层之间使用 JNDI(可能创建一个 CDI 生产者来根据 JNDI 名称或类似名称进行通用注入)
  • 在集成层中,将对象注入应用层(DAO)EJB 而不是 CDI bean

我不喜欢这两种解决方案(尤其是最后一种),因为它们限制了我未来的部署选项。第二种解决方案不限制我,但在某些时候它可能会变得乏味(当我积累大量代码时)。

最后,我的问题是:
有没有我还没有找到的选项,可以让我在 CDI 注入工作的同一台服务器上部署两个 JAR?如果在某些时候我将 JAR 分成不同的服务器,可能仍然可以工作?

【问题讨论】:

    标签: java jakarta-ee deployment ejb cdi


    【解决方案1】:

    是的,还有其他选择。

    1. 使用同样支持 OSGi 的 java EE 容器,并为您的部署依赖项使用 OSGi 接口。至少 Websphere、Glassfish、JBoss(安装了 jbosgi)、Jonas 支持部署 OSGi 包。这意味着你的模块应该被转换成 OSGi 包。

    2. 使用允许模块相互通信的特定于容器的扩展。 JBoss 作为 jboss-deployment-structure.xml,您可以使用它来依赖另一个部署。

    3. 为您的依赖项使用服务器提供的共享类路径。真的不推荐这个。

    我会投给 OSGi。

    但是,如果您将软件包部署到不同的服务器,它们都不会自行工作。不同服务器之间需要远程 EJB、远程 JNDI 查找、Spring 远程处理、基于 HTTP 的 api、CORBA 或类似的远程技术。在 Java EE 中,EJB 是事实上的标准,但 Spring 远程处理也不错。


    更新:您补充说您使用 TomEE 服务器。事实上,TomEE 不支持我提到的前两个选项。在这种情况下,我会使用 EJB - 您使用 EJB 的事实可以使用 EJB 委托从业务层中抽象出来,并且您可以仅将 EJB(无状态会话 bean)用于接口部分,而将您的 DAO 保留为 POJO .

    【讨论】:

    • 我在 TomEE 服务器上进行部署,但我认为它不支持这些选项中的任何一个。我也有兴趣让事情尽可能独立于服务器选择,以防我以后更改服务器。我意识到 EJB 是实现此目的的方法,我唯一担心的是从我的集成层移动到我的应用程序层的对象是 DAO,出于某种原因,使它们成为 EJB 对我来说似乎是错误的。我错了吗?
    • @eitanfar 如果您为此使用 EJB,那么您的接口层应该是 EJB(准确地说是无状态会话 bean),而不是 DAO 本身!我实现它的方式是为接口 -> 组件服务接口 -> 组件服务实现 -> 内部 DAO 设置一个 EJB 层。这允许最大程度地解耦和分离我需要的关注点。此外,对于我所有的 EJB,有一个单独的 EJB 委托实际上用于查找,因此 EJB 查找完成的事实对应用程序层是不可见的。 EJB 委托可以用作 POJO。
    • 我确实意识到这可能比您想要的更多层次,当然,拥有这么多层次并不是强制性的。
    • 如果我理解正确,您是在建议我添加组件服务实现层(因为现在我已经有了组件服务接口和内部 DAO)。我必须承认,它看起来确实比我最初计划的更分层,但同样,它会为我提供更多的灵活性,因为它会增加解耦。此外,它似乎也以一种干净的方式解决了我的问题,因为我将通过 EJB 完成所有通信,而不会暴露 DAO 本身。非常感谢!
    【解决方案2】:

    不确定您的目标是什么,但部署战争很好,甚至可以使用以下命令手动完成:

    mkdir -p webapps/myapp/WEB-INF/lib
    cp myjar*.jar webapps/myapp/WEB-INF/lib/
    

    如果您的目标是能够拆分它们,您可以使用 TomEE skinny war 功能。

    使用 WEB-INF/jars.txt 文件创建战争。

    在这个 jars.txt 中按依赖项/jar 放置一行。它可以是 jar 或 maven 坐标的路径。

    一旦设置,它将允许您一个一个地更改 jar,然后只需重新启动服务器。当多个团队在同一个二进制文件上工作时,这非常棒。

    TomEE 有一些替代方案,但这个的优点是易于更改为便携式(战争)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-14
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多