代码之家  ›  专栏  ›  技术社区  ›  Daniel Schneller

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

  •  17
  • Daniel Schneller  · 技术社区  · 17 年前

    我手头有一个相当大的(几个MLOC)应用程序,我希望将其拆分为更易于维护的独立部分。目前,该产品由大约40个Eclipse项目组成,其中许多项目具有相互依赖性。这本身就使得连续构建系统不可行,因为每次签入都需要重建很多。

    是否有一种“最佳实践”的方法

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

    如果有(免费/开放)的工具来支持这一点,我会很感激你的指点。

    尽管我对Maven没有任何经验,但它似乎强制了一个非常模块化的设计。我现在想知道这是否是可以反复改进的东西,或者使用它的项目从一开始就必须考虑模块化。

    编辑2009-07-10

    我们正在使用 Apache Ant/Ivy . 真正有用且设计良好的工具,不会像maven那样对您施加太多压力。

    www.danielschneller.com

    7 回复  |  直到 17 年前
        1
  •  9
  •   Mario Ortegón    17 年前

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

    OSGi提供的机制将帮助您理顺现有代码。由于类加载的工作方式,它还可以帮助您更轻松地处理修补程序。

    Some concepts of OSGi that seem to be a good match for you, as shown from wikipedia:

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

    • Bundles-Bundles是带有额外清单头的普通jar组件。
    • 服务-服务层通过为普通旧Java对象(POJO)提供发布-查找绑定模型,以动态方式连接捆绑包。
    • 服务注册-管理服务(ServiceRegistration、ServiceTracker和ServiceReference)的API。
    • 生命周期-用于生命周期管理(安装、启动、停止、更新和卸载捆绑包)的API。
    • 模块-定义依赖项的封装和声明(捆绑包如何导入和导出代码)的层。
        2
  •  6
  •   Andreas Dolk    17 年前

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

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

    据我看来,eclipse、maven和nexus(或任何其他maven存储库管理器)是一个良好的起点。如果您对系统架构有很好的文档记录,那么您是幸运的 此体系结构已真正实现;)

        3
  •  3
  •   Glorfindel Doug L.    7 年前

    • 编撰 没有“模块”以查看其使用情况
    • 我处理循环依赖关系(这是一项非常容易出错的任务)
    • 使用maven,可以部署大量文档(报告) 在您的CI过程中
    • 使用maven,您总是可以在netbeans(使用
      非常好的有向图)
    • 使用maven,您可以在代码库中导入库代码,应用源代码补丁和 使用您的产品进行编译(有时这很容易,有时很难 困难的)

    还要检查依赖项分析器:
    (来源: javalobby.org )

    Netbeans:


    zimmer428.net )

        4
  •  1
  •   Peter Lawrey    17 年前

    对于现有系统来说,迁移到Maven是一件痛苦的事情。但是,它可以轻松地处理100多个模块项目。

        5
  •  1
  •   Thorbjørn Ravn Andersen    17 年前

    在任何情况下,您都需要一个持续运行的集成系统。您的第一个任务是自动生成代码库,这样您就可以让CI系统监视您的源存储库,并在您更改内容时重新构建它。我决定在这里采用非Maven方法,我们专注于拥有一个简单的Eclipse环境,因此我使用ant4eclipse和TeamProjectSet文件创建了一个构建环境(我们无论如何都会使用)。

    您将受益于允许移动文件和保留历史的源存储库。CVS在这方面非常薄弱。

        6
  •  0
  •   kgiannakakis    17 年前

    我想你需要的是为你的项目做一个建筑布局。工具可能会有所帮助,但最重要的部分是组织模块的逻辑视图。

        7
  •  0
  •   pth - Structure101    13 年前