如何模块化(大型)Java应用程序?

2022-09-03 01:54:55

我手头有一个相当大的(几个MLOC)应用程序,我想将其拆分为更易于维护的独立部分。目前,该产品由大约40个Eclipse项目组成,其中许多项目具有相互依赖关系。仅此一点就使连续构建系统不可行,因为它必须在每次签入时进行大量重建。

有没有一种“最佳实践”方法

  • 识别可立即分离的部件
  • 直观地记录相互依赖关系
  • 解开现有代码
  • 处理我们需要应用于库的“补丁”(目前通过将它们放在实际库之前的类路径中来处理)

如果有(免费/开放)工具支持这一点,我将不胜感激。

尽管我对Maven没有任何经验,但它似乎强制采用了非常模块化的设计。我现在想知道这是否可以通过迭代方式进行改造,或者如果一个使用它的项目必须从一开始就考虑到模块化。

编辑 2009-07-10

我们正在使用Apache Ant / Ivy拆分一些核心模块。真正有帮助和精心设计的工具,不像maven那样强加给你那么多。

我在我的博客上写下了一些关于我们为什么要这样做的更一般的细节和个人意见 - 太长了,无法在这里发布,也许对每个人都不感兴趣,所以请自行决定:www.danielschneller.com


答案 1

使用OSGi可能很适合您。它将允许在应用程序之外创建模块。您还可以以更好的方式组织依赖项。如果正确定义了不同模块之间的接口,则可以使用持续集成,因为只需重新生成在签入时受影响的模块。

OSGi 提供的机制将帮助您理清现有代码。由于类加载的工作方式,它还可以帮助您以更简单的方式处理补丁。

OSGi的一些概念似乎很适合你,如维基百科所示:

该框架在概念上分为以下几个方面:

  • 捆绑包 - 捆绑包是具有额外清单标头的普通 jar 组件。
  • 服务 - 服务层通过为普通的旧 Java 对象 (POJO) 提供发布-查找-绑定模型,以动态方式连接捆绑包。
  • 服务注册表 - 用于管理服务(ServiceRegistration、ServiceTracker 和 ServiceReference)的 API。
  • 生命周期 - 用于生命周期管理(安装、启动、停止、更新和卸载捆绑包)的 API。
  • 模块 - 定义依赖项的封装和声明(捆绑包如何导入和导出代码)的层。
  • 安全性 - 通过将捆绑包功能限制为预定义的功能来处理安全性方面的层。

答案 2

第一:祝你好运和喝好咖啡。两者都需要。

我曾经遇到过类似的问题。具有可怕的循环依赖关系的旧代码,即使在来自不同包(如org.example.pkg1.A)的类之间也依赖于org.example.pk2.B反之亦然。

我从maven2和新鲜的eclipse项目开始。首先,我试图确定最常见的功能(日志记录层,通用接口,常见服务)并创建maven项目。每当我对某个部分感到满意时,我都会将库部署到中央nexus存储库,以便它几乎可以立即用于其他项目。

所以我慢慢地完成了这些层次。maven2 处理了依赖关系,m2eclipse 插件提供了一个有用的依赖关系视图。顺便说一句 - 将日食项目转换为maven项目通常不太困难。m2eclipse可以为您做到这一点,您只需要创建一些新文件夹(如src / main / java)并调整源文件夹的构建路径。只需一两分钟。但是,如果您的项目是 eclipse 插件或 rcp 应用程序,并且您希望 maven 不仅管理工件,而且还希望构建和部署应用程序,那么预计会遇到更多困难。

对于观点,eclipse,maven和nexus(或任何其他maven存储库管理器)是一个很好的开始基础。你很幸运,如果你有一个很好的系统架构文档,并且这个架构真的实现了;)


推荐