从多模块项目发布 bom
Publish a bom from a multi-module-project
我们是一家大公司,拥有大约 2000 个独立的 Java 项目。由于历史原因,我们没有多模块项目,但我们想介绍一下。
从逻辑上讲,我们已经有 "groups" 个项目,即有人负责(比如说)50 个密切相关的项目。这个人定期发布一个 BOM,其中包含这 50 个项目的最新、连贯的版本。
现在抓取这 50 个项目并将它们放入一个大型多模块项目中会很有意义。尽管如此,还是有必要发布 BOM,因为其他项目(在我们小组之外)应该有一致的版本。
因此,总而言之,我们需要一个 BOM,其中包含属于多模块项目的所有 50 个项目的版本。我想知道创建这样一个 BOM 的 "Maven way" 是什么。我能想到的:
- bom是多模块项目的第51个项目。依赖项的版本由父 pom 中的属性设置。
- bom 是根据多模块项目中存在的信息生成的,并作为副产品发布(这可能需要我们为此编写一个 Maven 插件)。
有什么建议?
我从未见过 2K 的商业 Java 项目,所以我的回答将基于开源的工作原理:
- 图书馆不应该按人分组 - 它们应该按他们解决的问题分组。通常开源项目有多个库,例如Jackson 有
jackson-databind
、jackson-datatype-jsr310
等。这些库彼此紧密相关,可能相互依赖。
- 这样的群体不应该太大。有些项目可能有 1 个,其他项目可能有 5 个或 10 个。一组中有 50 个库听起来太多了。
- 如果一个组中的所有库同时发布会更容易(即使只有一个被更新)。这使得在使用一组多个库的应用程序中跟踪版本变得简单。
- 组之间应该没有依赖关系!这可能是最重要的规则。相互依赖的库的深层层次结构是不可接受的,因为现在您需要保持许多项目和库之间的兼容性。这只是无法扩展。这意味着库之间偶尔会复制粘贴代码 - 这是较小的邪恶。
- 最后一条规则可能有一些例外(可能是 无处不在 的库),但这些必须保持 public [=45= 的向后兼容性] 直到没有项目依赖旧的 API。这样的库很难维护,最好将它们开源。
独立项目现在可以依赖来自相同或不同组的库,但由于组内的版本相同,因此很容易将其设置为 属性 一次。或者:
- 您可以查看
<scope>import</scope>
,它允许从其他 POM 文件导入 <dependencyManagement>
部分,例如组内的父 POM(出于某种原因,我从来没有用过)。
- 或者在 xxx-all modules - 一个依赖组内所有其他模块的模块,因此当你依赖它时,你也会传递地依赖其他模块。
我们也在为我们的多模块项目使用 BOM,但我们并未将它们的生成或更新与这些模块的构建联系起来。
只有当我们的发布管理流程完成一个构建模块(或一组模块)的交付时才会更新 BOM:一旦交付,BOM 就会更新并推送到 Nexus(存储为 1.0-SNAPSHOT 版本,每次交付后不断被覆盖)
BOM 然后包含在我们的 POM 中(用于单模块或多模块项目)并仅用于依赖管理,这意味着我们的项目依赖于工件 而没有 版本: BOM的依赖管理提供了其他依赖模块的最新交付版本。
换句话说,我们将构建方面(在此处使用 maven 完成)与发布部分分开:"bills of materials" 代表已交付的内容,并确保所有项目都使用被认为可以很好地协同工作的版本进行构建(因为它们已一起交付生产)。
我们是一家大公司,拥有大约 2000 个独立的 Java 项目。由于历史原因,我们没有多模块项目,但我们想介绍一下。
从逻辑上讲,我们已经有 "groups" 个项目,即有人负责(比如说)50 个密切相关的项目。这个人定期发布一个 BOM,其中包含这 50 个项目的最新、连贯的版本。
现在抓取这 50 个项目并将它们放入一个大型多模块项目中会很有意义。尽管如此,还是有必要发布 BOM,因为其他项目(在我们小组之外)应该有一致的版本。
因此,总而言之,我们需要一个 BOM,其中包含属于多模块项目的所有 50 个项目的版本。我想知道创建这样一个 BOM 的 "Maven way" 是什么。我能想到的:
- bom是多模块项目的第51个项目。依赖项的版本由父 pom 中的属性设置。
- bom 是根据多模块项目中存在的信息生成的,并作为副产品发布(这可能需要我们为此编写一个 Maven 插件)。
有什么建议?
我从未见过 2K 的商业 Java 项目,所以我的回答将基于开源的工作原理:
- 图书馆不应该按人分组 - 它们应该按他们解决的问题分组。通常开源项目有多个库,例如Jackson 有
jackson-databind
、jackson-datatype-jsr310
等。这些库彼此紧密相关,可能相互依赖。 - 这样的群体不应该太大。有些项目可能有 1 个,其他项目可能有 5 个或 10 个。一组中有 50 个库听起来太多了。
- 如果一个组中的所有库同时发布会更容易(即使只有一个被更新)。这使得在使用一组多个库的应用程序中跟踪版本变得简单。
- 组之间应该没有依赖关系!这可能是最重要的规则。相互依赖的库的深层层次结构是不可接受的,因为现在您需要保持许多项目和库之间的兼容性。这只是无法扩展。这意味着库之间偶尔会复制粘贴代码 - 这是较小的邪恶。
- 最后一条规则可能有一些例外(可能是 无处不在 的库),但这些必须保持 public [=45= 的向后兼容性] 直到没有项目依赖旧的 API。这样的库很难维护,最好将它们开源。
独立项目现在可以依赖来自相同或不同组的库,但由于组内的版本相同,因此很容易将其设置为 属性 一次。或者:
- 您可以查看
<scope>import</scope>
,它允许从其他 POM 文件导入<dependencyManagement>
部分,例如组内的父 POM(出于某种原因,我从来没有用过)。 - 或者在 xxx-all modules - 一个依赖组内所有其他模块的模块,因此当你依赖它时,你也会传递地依赖其他模块。
我们也在为我们的多模块项目使用 BOM,但我们并未将它们的生成或更新与这些模块的构建联系起来。
只有当我们的发布管理流程完成一个构建模块(或一组模块)的交付时才会更新 BOM:一旦交付,BOM 就会更新并推送到 Nexus(存储为 1.0-SNAPSHOT 版本,每次交付后不断被覆盖)
BOM 然后包含在我们的 POM 中(用于单模块或多模块项目)并仅用于依赖管理,这意味着我们的项目依赖于工件 而没有 版本: BOM的依赖管理提供了其他依赖模块的最新交付版本。
换句话说,我们将构建方面(在此处使用 maven 完成)与发布部分分开:"bills of materials" 代表已交付的内容,并确保所有项目都使用被认为可以很好地协同工作的版本进行构建(因为它们已一起交付生产)。