分离Java项目


12

我有一个大型的Java项目,我们在构建周期中使用了maven。这个项目被广泛使用-在其他项目中,在各种应用程序中,其中一些包含在其中,有些则在其他地方...老实说,这有点混乱(针对特定时间,在不同时间添加了不同的位目的),我想对其进行清理。另外,它还没有经过完全测试(没有适当的单元和集成测试就添加了很多位),并且有些测试需要很长时间才能运行或实际上没有通过……(嗯)测试在Maven构建周期中关闭(再次,呃,哦)。

我正在考虑将这个大型项目分成较小的特定项目,以使“最终”子项目(或几个子项目)可以选择所需的各个子项目。

我的想法如下:

  • 如果我将一个大型项目分为多个子项目,这将清楚说明每个项目的责任。
  • 通过分成多个子项目,我可以分别清理每个子项目的测试,然后在maven构建周期中打开该子项目的测试。

我有点担心这可能会对构建时间产生影响。

  • 在大型项目上(即放入较小的子项目中)采用结构会减慢编译器的速度吗?

另外,我对这可能会对IDE中的编辑时间产生什么影响(我们主要使用Intellij)略有担忧。Intellij似乎是通过依赖关系树依次构建每个项目的-例如,如果C依赖于B依赖于A,而我更改了A,除非A进行编译,否则它不会尝试构建B。可以说这是有好处的,但是我发现,例如,如果我更改了A在B和C中广泛使用的接口,则需要花费一些时间来修复该更改中的所有错误...

另一个问题是如何使用工厂类。该项目的某些方面取决于外部罐子。有时(非常不经常)更新这些内容,因此我们必须进行迁移。我们倾向于使用Factory类来处理此问题,该类指向外部代码的正确版本(因此,我们不必在整个代码库中更改所有实现)。

目前,这一切都在大型项目中,但是我认为通过切换到子项目,我可以开发一个新项目来实施新的外部代码,确保子项目功能完整并经过测试,并且然后在用户项目中切换依赖项/工厂类。但是,由于在整个大型项目中大量使用接口,因此使情况变得更加复杂。例如

  • 子项目A-包含接口
  • 子项目B-取决于A的接口和旧的外部jar
  • 子项目C-依赖于B(以及A和旧的外部jar),并且包含一个使用B的接口实现的Factory类。

如果需要更改B的外部jar,我可以:

  • 创建子项目B_ii-再次取决于A,现在取决于新的外部jar
  • 一旦功能完备,我可以将C的依赖项添加到B_ii,并更改Factory类以使用接口的新实现。
  • 当这一切正常的时候,我就可以删除C对原始B的依赖关系,如果需要,可以删除子项目B。

  • 这是明智的做法吗?

因此,总的来说,我的问题是:

  • 有没有人有分解大型项目的经验?您是否愿意分享任何提示/技巧?
  • 这对您的开发和构建时间有什么影响?
  • 您可以在构建此类项目的分解方面提供什么建议?

请注意,您可以创建一个父项目,并且将A,B和C分别逐个签出。例如,这允许IntelliJ同时将所有三个存储在内存中,并跨模块边界进行重构。
托尔比约恩Ravn的安徒生

Answers:


10

我将对此进行快速的初切(很棒的Q BTW!):

在大型项目上(即放入较小的子项目中)采用结构会减慢编译器的速度吗?

不够重要,实际上开销在Maven调用中。

另外,我对这可能会对IDE中的编辑时间产生什么影响(我们主要使用Intellij)略有担忧。Intellij似乎是通过依赖关系树依次构建每个项目的-例如,如果C依赖于B依赖于A,而我更改了A,除非A进行编译,否则它不会尝试构建B。可以说这是有好处的,但是我发现,例如,如果我更改了A在B和C中广泛使用的接口,则需要花费一些时间来修复该更改中的所有错误...

关于Maven绑定和依赖项管理,不同的IDE具有不同的优势。当前的情况似乎是它几乎只能在最新的Eclipse,Netbeans和IntelliJ上运行-但是您将不得不教给开发人员一些紧急的双重想法:“从磁盘刷新源文件并重建所有相关的maven项目”。

我发现这些天我必须做的越来越少。顺便说一句,拥有SSD驱动器在这里有很大的不同。

剪断工厂类段落

无论使用哪种技术(Maven / Ivy /什么)来帮助您实施依赖管理,依赖管理都非常重要。

首先,我将从Maven依赖插件中获取大量报告,并对您所拥有的东西进行盘点。一般来说,您在POM的依赖关系管理中将依赖关系设置为在食物链中尽可能高,但不要更高。因此,如果您的两个子模块使用外部依赖关系,则将其拖到其父POM中,依此类推。

外部JAR升级应始终作为一个适当的小型项目来完成。评估您为什么要升级,更改源代码以利用任何新功能/错误修复等。如果没有进行此分析和工作就修改版本,将会给您带来麻烦。

因此,总的来说,我的问题是:

有没有人有分解大型项目的经验?您是否愿意分享>技巧/窍门?

  • 接口和依赖注入是您的朋友。
  • 迈克尔·费瑟(Michael Feather)关于有效处理遗留代码的书是必读的。
  • 集成测试是您的朋友
  • 将子项目分为foo-api(仅接口!)和foo-core,并使模块仅依赖于foo-api可以极大地帮助并实现分离
  • Jboss模块和/或OSGi可以帮助执行清晰的分离

这对您的开发和构建时间有什么影响?

对开发和构建时间的影响非常小-极大地增加了我们整体连续交付流程的时间。

您可以在构建此类项目的分解方面提供什么建议?

正确处理小事情,事后大事往往会彻底解决。因此,要一点一点地分开-除非您的集成测试覆盖率很高,否则不要对整个产品进行大规模的重组。

在拆分之前编写集成测试-拆分之后,您应该或多或少获得相同的结果。

绘制您现在拥有的模块化以及想要达到的位置的图表。设计中间步骤。

不要放弃-一些牦牛剃须现在建立了能够“快速构建和重构无惧”的基础无耻的插件 - >从本和我是在良好的接地Java开发

祝你好运!


0

我对此的看法仅在必要时分开。但是,这提出了下一个问题:如何确定是否有必要?

  • 当工件不同时(即不要在同一项目中构建EAR,WAR,JAR和Integration-testing-jar)。
  • 在分离期间,您会发现一些代码需要存在于多个工件中,并将它们重构为新代码。
  • 当团队之外的其他项目想要使用项目中已有的东西时。

原因之一是开发人员必须处理多个项目,并试图弄清楚除了Java软件包之外,它还应该属于哪个项目。我参与过的项目变得非常贫乏,并且有一个项目只有四个类实现一种功能,因为这是体系结构的方向。这也早在Maven流行之前就已经存在,因此类路径以及不需要在IDE和Ant脚本上设置的路径。

另一个原因是,您需要处理更多的移动部分来处理文件周围的内容,并且在知道之前可能会遇到依赖性意大利面条。

在项目内进行重构也比在项目间进行重构更容易。

如果构建时间是一个问题,则只需提供更好的硬件即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.