我正在为使用 Java EE 5 开发的大型软件系统设计构建系统和目录结构。构建系统将使用ant 来实现。

我们有多种不同的服务,并按主题分组。每个服务都提供 Web 服务或 EJB。每个服务都运行在专用的应用程序服务器集群上。因此,我们有多个集群,其中一些集群可以按主题进行逻辑分组。

我确实阅读了通用定义和示例,但我仍然对 Java EE 术语感到困惑:

  • 什么是 Java EE 应用程序?那么,EAR 文件的内容是什么?
  • 什么是 Java EE 项目?(Netbeans 以及企业应用程序的 Java 蓝图指南项目约定中都使用该术语)

我是否必须将所有 EJB 和 WAR 模块包文件放入一个 EAR 中,以便该单个 EAR 包含我们的完整系统?

或者我是否将每组服务放入一个 EAR 中,尽管这些服务仅在逻辑上进行分组,而不是在技术上进行分组?

或者我是否为每个服务组装一个单独的 EAR,即通常只包含一个 EJB jar 文件,有时还包含 EJB 和 WAR 文件?

或者我是否放弃应用程序的概念而仅仅构建 EJB 和 WAR 文件,以便为每个应用程序服务器集群提供一个部署文件?

我想,我的主要问题是:打包 EAR 文件有哪些优点?

目前我认为,只需要 EAR-EJB 和 WAR 文件,以及 ant-build-system 中嵌套子项目的概念和我们源代码的目录结构?

编辑:非常感谢您的回答!在我看来,打包到耳朵中的应用程序是一个相当原子的子系统。所以我想,我将有一个嵌套的子项目结构(仅是逻辑的,仅对构建系统和源代码的目录结构可见)和相当大量的 EAR,每个 EAR 大多只包含一个 ejb-jar和/或 war 模块并实现单个服务(部署在单个应用程序服务器集群上)。

有帮助吗?

解决方案

我认为您决定在每个 EAR 中添加的内容取决于组织和技术问题。

我认为 EAR 最重要的技术角色是运行时环境中的类加载器根。这通常意味着您可以在不同的 EAR 中部署不同版本的库和您自己的类。这意味着您应该保持容器根类路径相当空(或由容器供应商提供),因为它可能允许一个物理容器使用可能存在冲突的库为多个应用程序提供服务。如果您正在使用通用代码库开发许多不同的应用程序,那么这是个好消息。您可以将多个项目部署到同一个服务器场,而不会互相干扰。

您通常不会部署比 EAR 更小的软件单元。每个 EAR 或多或少都可以是完全独立的。我通常会让这些内容反映所属组织对应用程序或子系统的看法。您通常可以将相同的组件打包在多个 EAR 中。

其他提示

这里有很多问题。

Java EE 项目是使用 Java EE 技术的 EAR 或 WAR 部署。如果您有一个包含 JSP 和关系数据库的 JDBC 访问的 WAR,那么这就是一个 Java EE 项目。EAR 文件的最初意图是“企业”,这意味着 EJB。EAR 文件包含 EJB、WAR、JAR 以及整个 enchilada。

服务方面的思考有些不同。我认为部署值得仔细考虑,因为如果需要进行任何维护,则打包在一起的组件必须一起关闭和启动。

因此,请仔细考虑如何打包您的服务。在我看来,这不是一个全有或全无的笼统答案。您应该查看您的服务正在做什么以及如何将它们一起使用,以决定如何打包和部署它们。

逻辑和组织方面的考虑都会发挥作用。每个 EAR 将包含与特定功能相关的所有部分。我们始终可以假设每个 EAR 都是独立的,并且可以部署在一个或多个容器上。我一直遵循的典型方法是让每个 EAR 包含一个或多个 jars 和 wars。每个 war 或 jar 都包含一些关键组件或一组相关组件。EAR 代表一个企业应用程序,其中包含该应用程序的组件和 Web 应用程序。一个例子是我参与的支付处理系统。EAR 包含运行支付处理系统所需的一切。这包括六个罐子和三场战争。每个 jar 代表一些功能或功能的逻辑分组。每场战争都代表一个网络应用程序。罐子的组成示例:

  • 核心功能的 jar
  • 一个用于 ejb 的 jar
  • 一个装我们高级金融数学作品的罐子
  • 一个用于我们的安全部件等的罐子。拥有多个 jar 是因为不同的人开发了不同的部分,因此他们在不同的 Eclipse 项目中工作,并根据需要将它们组合起来。没有硬性规定,只要适合您的团队和情况即可。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top