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

我手头有一个相当大的(几个MLOC)应用程序,我想将其分解为更易维护的独立部分。 目前该产品由大约40个Eclipse项目组成,其中许多项目具有相互依赖性。 仅凭这一点,连续构建系统就不可行,因为每次登记都需要重建。

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

  • 识别可以立即分离的零件
  • 可视化地记录相互依赖关系
  • 解开现有的代码
  • 处理“补丁”我们需要应用到库(目前通过将它们放入实际库之前的类路径中进行处理)
  • 如果有(免费/开放)工具来支持这一点,我会很感激指针。

    尽管我对Maven没有任何经验,但它似乎迫使一个非常模块化的设计。 我现在想知道这是否是可以迭代改进的东西,或者如果要使用它的项目从一开始就必须以模块化的方式进行布置。

    编辑2009-07-10

    我们正在使用Apache Ant / Ivy分离出一些核心模块。 真正有用且设计良好的工具,并不像Maven那样强大。

    我在博客上写下了一些更一般的细节和个人意见,说明我们为什么要这样做 - 太长时间无法在这里发布,也许对每个人都不感兴趣,因此请按照自己的判断进行操作:www.danielschneller.com


    使用OSGi可能非常适合你。 这将允许从应用程序中创建模块。 您还可以更好地组织依赖关系。 如果您正确定义了不同模块之间的接口,那么您可以使用持续集成,因为您只需重建受登记影响的模块。

    OSGi提供的机制将帮助您解开现有的代码。 由于类加载的方式,它也可以帮助您以更简单的方式处理修补程序。

    从wikipedia中可以看出,OSGi的一些概念似乎与您很相称:

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

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

  • 第一:祝你好运,好咖啡。 你需要两个。

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

    我从maven2和新的eclipse项目开始。 首先,我尝试确定最常用的功能(日志记录层,常用接口,公共服务)并创建了Maven项目。 每次我对零件感到满意时,我都会将库部署到中央连接库,以便它几乎可以立即用于其他项目。

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

    意见,日食,maven和nexus(或任何其他的Maven仓库经理)是一个很好的基础开始。 你很幸运,如果你有一个好的系统架构文档并且这个架构真的被实现的话)


    我在一个小代码库(40 kloc)中有类似的经验。 没有“规则”:

  • 编译有没有“模块”以查看它的用法
  • 我从“叶模块”开始,没有其他依赖的模块
  • 我处理循环依赖(这是一个非常容易出错的任务)
  • 通过maven,可以在CI流程中部署很多文档(报告)
  • 与maven你总是可以看到什么使用什么都在netbeans网站(与一个
    非常好的有向图)
  • 使用maven,您可以在代码库中导入库代码,应用源代码补丁并与您的产品进行编译(有时这很容易,有时候非常困难)
  • 还请检查依赖关系分析器:http://www.javalobby.org/servlet/JiveServlet/download/17-96956-92153685-7907/screenshot.jpg

    Netbeans的:

    http://dm.zimmer428.net/wp-content/uploads/2009/02/67pre-dependency-graph.jpg

    链接地址: http://www.djcxy.com/p/30679.html

    上一篇: How to modularize a (large) Java App?

    下一篇: Which Javascript engine would you embed in your application?