8

我有一个 JavaEE6 应用程序,由 Web 内容和 EJB 组成,并且仅部署为 WAR(使用 EJB3.1)。该构建基于 Maven。我刚刚读到了一种在 Java EE 6 中订购模块初始化的新可能性我的应用程序也需要它。另外,我希望有一个选项可以在 XML 中定义一些 EJB 属性。

由于该示例部署为 EAR 项目,因此在 application.xml 中定义了订单。但是在一个 WAR 部署的项目中,没有 application.xml。现在我想知道我在哪里可以定义这些信息?或者是否可以在 WAR 部署的应用程序中以某种方式使用 application.xml?

编辑:

糟糕,我没有正确阅读模块顺序示例,一开始我认为这是关于我的应用程序中的 EJB 的加载顺序。当然,我的 WAR 应用程序中只有一个模块,所以订购没有意义。

好的,但是就我而言,还有一个大问题(也更改了问题标题以反映变化):ejb-jar.xml 怎么样?我可以以某种方式在 XML 中定义关于我的 EJB 的东西(因为它对某些设置很有用,以避免重新编译)?

4

2 回答 2

9

简而言之,基于 WAR 的部署是不可能的。

Java EE 6 的模块初始化功能旨在以特定顺序初始化应用程序的不同模块。当您拥有基于 WAR 的 EJB 应用程序时,您的 EJB 和 Web 应用程序将不再有单独的模块。只有一个模块 - 基于 WAR 的部署中的Web 应用程序模块

因此,如果您必须实现与 Java EE 6 中提供的模块初始化顺序相同的功能,则必须执行以下任一操作:

  • 将 EJB 分离到一个单独的模块中,并使用基于 EAR 的部署。
  • 这或多或少有点诡计,就像在 Java EE 5 中所做的那样,您会希望避免它。您可能希望在代码中使用单例 EJB 之前对其进行逻辑编码以确保已创建单例 EJB(假设这是由于在应用程序中使用了单例)。

ejb-jar.xml 在 WAR 文件中的位置

EJB 3.1 规范(在打包一章中)解决了部署在 WAR 中时 ejb-jar.xml 文件的位置问题:

在 .war 文件中,部署描述符以名称 WEB-INF/ejb-jar.xml 存储。

PS:我还没有尝试过这种部署方式。YMMV。

于 2010-07-26T16:35:24.510 回答
5

.wars 和 ejb-jar.xml 处理中的 EJB 的旁注。如前所述,该位置是 WEB-INF/ejb-jar.xml,但还要注意,即使在 WEB-INF/lib/ 中有 ejbs jar ,它也是唯一检查的位置——通过标准规则任何 META-INF/ejb- jar.xml 文件被忽略。

专家组在这方面存在分歧,因此如果您有偏好,将反馈发送到 EJB 3.1 专家组列表以供 EJB.next 考虑还为时不晚。

我的投票是仍然允许单个 jar 具有 META-INF/ejb-jar.xml 文件,就像这些 jar 现在可以具有 persistence.xmls、bean.xmls、Web 片段等一样。对我来说更大的问题是它不一致嵌入式 EJB 容器 API 支持 EAR 样式的类路径,该类路径允许多个 jar/模块,每个可能包含 META-INF/ejb-jar.xml 文件。结果是,如果您确实使用嵌入式 API 来测试组成单个 .war 文件的多 jar ejb 应用程序,那么您将面临将您拥有的任何 ejb-jar.xml 数据合并到单个 ejb 中的任务-jar.xml 用于 web 应用程序。对用户来说是一种痛苦。

于 2010-08-02T00:03:23.733 回答