从多模块项目发布bom

时间:2017-11-16 15:58:04

标签: java maven multi-module maven-bom

我们是一家拥有约2000个独立Java项目的大型公司。由于历史原因,我们没有多模块项目,但我们想介绍它们。

从逻辑上讲,我们已经有了“团体”项目,即负责(例如)50个密切相关项目的人。这个人定期发布一份BOM,其中包含这50个项目的近期连贯版本。

现在抓住这50个项目并将它们放入一个大型多模块项目中会很有意义。但是,有必要发布BOM,因为其他项目(我们组之外)应该具有连贯的版本。

因此,总结一下,我们需要一个BOM,其中包含属于多模块项目的所有50个项目的版本。我想知道创建这样一个BOM的“Maven方式”是什么。我能想到的是:

  • bom是多模块项目的第51个项目。依赖项的版本由父pom中的属性设置。
  • bom是根据多模块项目中存在的信息生成的,并作为旁边工件发布(这可能需要我们为此编写一个Maven插件)。

什么是可取的?

2 个答案:

答案 0 :(得分:4)

我从未见过2K商业Java项目,所以我的答案将基于开源的工作方式:

  • 图书馆不应按人分组 - 他们应该按照他们解决的问题进行分组。通常,开源项目有多个库,例如杰克逊有jackson-databindjackson-datatype-jsr310等。这些图书馆与每个图书馆紧密相关,可能相互依赖。
  • 这些团体不应该太大。有些项目可能有1个,其他项目有5个或10个。组中的50个库听起来太多了。
  • 如果组中的库同时全部释放(即使只更新了一个),也会更容易。这样可以直接跟踪使用组中多个库的应用程序中的版本。
  • 组之间应该有没有依赖关系!这可能是最重要的规则。不能接受彼此依赖的库的深层次结构,因为现在需要保持许多项目和库之间的兼容性。这只是不规模。这意味着在lib之间会偶尔出现复制粘贴代码 - 这是较小的邪恶。
  • 最后一条规则可能有一些例外(可能是一个用于到处的lib)但是那些必须保持公共API的向后兼容性,直到没有依赖旧API的项目为止。这些库很难维护,最好开源它们。

独立项目现在可以依赖于来自相同或不同组的库,但由于组内的版本相同,因此很容易将其设置为属性一次。可替换地:

  • 您可以查看<scope>import</scope>,它允许从其他POM文件导入<dependencyManagement>部分,例如组内的父POM(出于某种原因从未为我工作过)。
  • 或者在xxx-所有模块 - 依赖于组内所有其他模块的模块,因此当您依赖它时,您也可以依赖其他模块。

答案 1 :(得分:4)

我们正在为多模块项目使用BOM,但我们并没有将它们的生成或更新与这些模块的构建联系起来。

只有在我们的发布管理流程完成内置模块(或模块组)的交付时才会更新BOM:一旦交付,BOM就会更新并推送到Nexus(存储为1.0-SNAPSHOT版本,不断被覆盖)每次交货后)

然后将BOM包含在我们的POM中(用于单模块或多模块项目)并仅用于依赖关系管理,这意味着我们的项目依赖于工件而不用版本:来自BOM的依赖关系管理提供其他相关模块的最新交付版本。

换句话说,我们将构建方面(在这里与maven一起完成)与发布部分分开:“材料清单”代表已经交付的内容,并确保所有项目都在构建与被认为一起工作良好的版本(因为它们已经一起投入生产)。