Java 如何在多个应用程序之间共享业务逻辑

Java 如何在多个应用程序之间共享业务逻辑,java,jakarta-ee,maven,architecture,ejb,Java,Jakarta Ee,Maven,Architecture,Ejb,我们必须为同一家公司开发和维护许多不同大小、范围和生命周期的基于Java web的应用程序。其中一些是巨大的,而另一些只是简单的页面,可能只存在几个月(或几天),一些已经实现,需要重构 不过有一个共同点,他们需要访问(几乎)相同的信息 问题 由于该公司处理的数据非常复杂,我们必须处理许多不同的来源,其中一些来源是从古代继承的。我们的域对象可以映射到许多这些源。例如,合同域对象映射到主数据库,但其相关(物理)文件存储在文档服务器中,与之相关的活动存储在NoSQL数据库中。因此,添加、删除和搜索这些

我们必须为同一家公司开发和维护许多不同大小、范围和生命周期的基于Java web的应用程序。其中一些是巨大的,而另一些只是简单的页面,可能只存在几个月(或几天),一些已经实现,需要重构

不过有一个共同点,他们需要访问(几乎)相同的信息

问题

由于该公司处理的数据非常复杂,我们必须处理许多不同的来源,其中一些来源是从古代继承的。我们的域对象可以映射到许多这些源。例如,合同域对象映射到主数据库,但其相关(物理)文件存储在文档服务器中,与之相关的活动存储在NoSQL数据库中。因此,添加、删除和搜索这些对象都涉及许多内部操作

我们的数据来源是(尽管可能是任何):

  • AS400(使用DB2作为数据库)
  • Documentum文档管理器
  • 蒙戈数据库
  • 外部web服务
  • 其他遗留资源
我们通常使用Glassfish作为应用服务器,使用maven作为构建工具

目标

我们的目标是创建一个所有应用程序都可以访问的业务层或库,它是:

  • 紧凑的
  • 一致的
  • 易于使用
  • 易于维护
  • 可从许多不同的客户端访问
到目前为止我们所发现的

我们已经挣扎了几个星期,但仍然找不到任何完全令人满意的东西。一些解决方案:

  • 将所有业务逻辑打包到一个或多个jar中:很容易共享,但所有应用程序都必须包含所有jar依赖项和配置文件,并负责安全性、缓存和其他内容。难以维护(当发生更改时,我们必须更新每个项目的JAR)

  • 创建一个包含所有逻辑的Ejb项目并远程访问它:易于维护、安全性、缓存和配置只实现一次。我们担心远程呼叫的惩罚。正如我们在研究中所注意到的,这似乎是一种不好的做法(我们没有太多的EJB经验)

  • 创建一个包含所有内容的Ear项目,并使用本地访问:好吧,这比远程版本快,但维护起来非常困难

  • 选择OSGI:我们有点害怕它,因为它不像Ejb那样受欢迎,而且我们从未认真使用过它

对于这类问题有一种常见的做法吗


非常感谢

我不建议将所有逻辑放在一个EAR项目中并使用本地访问。如果您在一个地方有很多代码,那么维护、测试、部署等都会变得更加困难

我将创建具有公共依赖项的multi模块maven项目。其中一个依赖服务具有业务逻辑和DAO访问,这将公开API。使用Maven项目,您可以轻松控制POM文件的版本。不同的项目可能使用不同版本的通用服务。Maven将为您处理版本控制。然而,它需要一些配置和实现工作

您提到的另一个选项-带有远程EJB的独立EAR也可以正常工作。不要担心性能和远程调用的数量,除非您的负载很重。只需在客户端缓存远程EJB存根,以避免不必要的JNDI查找


就个人而言,我更喜欢由Maven管理的共享依赖关系的第一个选项。它清晰且易于维护,易于管理版本、部署和配置。有了Maven,您不需要为每个项目手动更改jar文件,您只需使用Nexus之类的工具,因为我已经做了一些EJB。您能解释一下为什么需要单独的BL吗?对于数据方面,您使用的是DAO模式吗?是否有可能通过这些映射到多个源?应该可以管理多个数据源。感谢您的超快速回答!这实际上是主要思想。我们想用DAO来封装所有脏东西。问题是如何从“客户端”应用程序访问这些DAO。如果您正在构建一个全新的应用程序,我建议使用osgi方法。但是如果你打算移植很多东西,而且团队是osgi的新手,我不推荐你这么做。谢谢安东。到目前为止,我们有一个由6个模块(所有业务逻辑和域对象)组成的多模块maven项目。我理解你的意思,我们可以将每个客户端应用程序作为另一个独立的maven项目,并将业务API作为依赖项调用,对吗?在这种情况下,这意味着我们将为每个客户端应用程序部署一个业务API,在这种情况下,我们将不得不使用不同的应用程序服务器。是的,如果您将业务逻辑提取到单独的maven项目中,您可以将其作为依赖项包含到所有应用程序中。在这种情况下,如果需要,可以使用不同的应用程序服务器