Java通用工程模块bom包管理
文章目录

前言
博主介绍:✌目前全网粉丝4W+,ZEEKLOG博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。
涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。
博主所有博客文件目录索引:博客目录索引(持续更新)
ZEEKLOG搜索:长路
视频平台:b站-Coder长路
一、什么是bom包?
BOM 的全称是 Bill Of Materials(材料清单)。
在软件开发的语境下,特别是在 Maven 中,BOM 是一个特殊的 POM(Project Object Model)文件。它的核心作用是统一管理一组相互关联的依赖库的版本,确保这些依赖的版本是相互兼容的,从而避免版本冲突。
您可以把它想象成一个依赖版本目录或版本说明书。
二、BOM 的用途和优势
用途:
- 解决版本冲突:大型项目或微服务架构中,会引入大量第三方库。这些库自身又可能依赖其他库(传递性依赖)。如果不同模块对同一个传递依赖的版本要求不一致,就会导致版本冲突。BOM 由官方或社区维护,它定义了所有相关依赖的“经过测试且彼此兼容”的版本。
- 简化依赖管理:使用 BOM 后,在项目中声明依赖时,无需再指定版本号(
**<version>**标签)。版本号由 BOM 统一提供。这使得 POM 文件更加简洁,并且所有模块使用的版本高度一致。 - 保证兼容性和稳定性:BOM 的维护者会确保列表中所有依赖的版本组合是稳定和兼容的。例如,Spring Boot 的 BOM 确保了特定的 Spring Framework、Spring Data、Spring Security 等版本可以完美地协同工作。
没有 BOM 时:你需要为每个依赖手动指定版本,并自行确保它们兼容。
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.23</version><!-- 需要自己指定 --></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.23</version><!-- 必须和上面的版本匹配 --></dependency></dependencies>有 BOM 时:你只需要从 BOM 中“引用”依赖,无需关心版本。
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><!-- 版本由BOM管理 --></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><!-- 版本由BOM管理 --></dependency></dependencies>三、如何使用 BOM(Maven 案例)
3.1、调研 Langchain4j BOM包案例
介绍
下面以 Langchain4j BOM 为例。
Langchain4j地址:https://github.com/langchain4j/langchain4j/blob/main/langchain4j-bom/pom.xml
langchain4j bom【定义自身工程版本模块】

规范:
1、外层继承langchain4j-parent
2、本身pom的packaging为pom
3、版本管理写在dependencyManagement中
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>dev.langchain4j</groupId><artifactId>langchain4j-parent</artifactId><version>1.4.0-beta10-SNAPSHOT</version><relativePath>../langchain4j-parent/pom.xml</relativePath></parent><artifactId>langchain4j-bom</artifactId><version>1.4.0-SNAPSHOT</version><packaging>pom</packaging><name>LangChain4j :: BOM</name><description>Bill of Materials POM for getting full, complete set of compatible versions of LangChain4j modules</description><dependencyManagement><dependencies><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-core</artifactId><version>1.4.0-SNAPSHOT</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId><version>1.4.0-beta10-SNAPSHOT</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-core</artifactId><version>1.4.0-SNAPSHOT</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>1.4.0-SNAPSHOT</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-test</artifactId><version>1.4.0-beta10-SNAPSHOT</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><configuration><flattenMode>bom</flattenMode><pomElements><properties>remove</properties><distributionManagement>remove</distributionManagement></pomElements></configuration><executions><execution><id>flatten</id><goals><goal>flatten</goal></goals><phase>process-resources</phase></execution><execution><id>flatten.clean</id><goals><goal>clean</goal></goals></execution></executions></plugin></plugins></build></project>langchain4j parent(定义外部依赖jar包)

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>dev.langchain4j</groupId><artifactId>langchain4j-parent</artifactId><version>1.4.0-beta10-SNAPSHOT</version><packaging>pom</packaging><name>LangChain4j :: Parent POM</name><description>${project.name}</description><url>https://github.com/langchain4j/langchain4j/tree/main</url><licenses><license><name>The Apache Software License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0.txt</url><distribution>repo</distribution></license></licenses><developers><developer><id>dliubarskyi</id><name>Dmytro Liubarskyi</name><email>[email protected]</email><url>https://github.com/dliubarskyi</url></developer></developers><properties><java.version>17</java.version><maven.compiler.release>${java.version}</maven.compiler.release><kotlin.code.style>official</kotlin.code.style><kotlin.compiler.jvmTarget>${java.version}</kotlin.compiler.jvmTarget><kotlin.compiler.languageVersion>1.9</kotlin.compiler.languageVersion><properties/><dependencyManagement><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.18.0</version></dependency> .... </dependencies></dependencyManagement> ... 顶层目录pom

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>dev.langchain4j</groupId><artifactId>langchain4j-aggregator</artifactId><version>1.4.0-beta10-SNAPSHOT</version><packaging>pom</packaging><name>LangChain4j :: Aggregator</name><modules><module>langchain4j-parent</module><module>langchain4j-bom</module><module>langchain4j-core</module><module>langchain4j-test</module><module>langchain4j</module><module>langchain4j-kotlin</module><module>langchain4j-easy-rag</module><module>langchain4j-mcp</module>主要用来管理modules模块的。
如何使用?
方式一:直接导入bom依赖
通常我们将使用的bom包引入dependencymanagment管理:
<dependencyManagement><dependencies><!--引入SpringBoot依赖管理清单--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--引入langchain4j依赖管理清单--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency><!--引入百炼依赖管理清单--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency>后续子模块引入即可参考如下,无需写版本:

方式二:继承父 POM
可间接直接使用parent中管理的外部第三方依赖版本适配:
<project><!-- 指定父POM --><parent><groupId>dev.langchain4j</groupId><artifactId>langchain4j-parent</artifactId><version>1.4.0-beta10-SNAPSHOT</version><relativePath/></parent><groupId>com.example</groupId><artifactId>my-spring-boot-app</artifactId><version>1.0.0</version><dependencies><!-- 无需指定版本,版本由父POM管理 --><!--langchain4j高级功能--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId></dependency>3.2、自定义bom、parent包管理

实际上在这三个pom中主要都是维护模块的版本,无非是第三方依赖版本,还是当前模块的版本的区别。
dt-ai-bom:继承dt-ai-parent,同时管理当前所有模块的版本控制。
dt-ai-parent:管理所有第三方依赖的版本。
底层pom:module管理,管理所有当前整个系统的模块。
dt-ai-bom
bom中继承dt-ai-parent,同时管理当前所有模块的版本:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.dtstack</groupId><artifactId>dt-ai-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../dt-ai-parent/pom.xml</relativePath></parent><artifactId>dt-ai-bom</artifactId><packaging>pom</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>com.dtstack</groupId><artifactId>dt-ai-core</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.dtstack</groupId><artifactId>knowledge-ai-server</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.dtstack</groupId><artifactId>knowledge-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.dtstack</groupId><artifactId>zentao-mcp-server</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.dtstack</groupId><artifactId>knowledge-warehouse-base</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.dtstack</groupId><artifactId>knowledge-warehouse-yuque</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></dependencyManagement></project>dt-ai-parent
独立存在,用于管理所有第三方依赖的版本:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dtstack</groupId><artifactId>dt-ai-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.2.6</spring-boot.version><knife4j.version>4.3.0</knife4j.version><langchain4j.version>1.0.0-beta4</langchain4j.version><mybatis-spring-boot.version>3.0.4</mybatis-spring-boot.version><druid-spring-boot.version>1.2.18</druid-spring-boot.version></properties><dependencyManagement><dependencies><!--引入SpringBoot依赖管理清单--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--引入langchain4j依赖管理清单--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency><!--引入百炼依赖管理清单--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency> ... <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency></dependencies></dependencyManagement><distributionManagement><repository><id>dtstack-release</id><url>http://nexus.dev.dtstack.cn/nexus/content/repositories/dtstack-release/</url></repository><snapshotRepository><id>dtstack-snapshot</id><url>http://nexus.dev.dtstack.cn/nexus/content/repositories/dtstack-snapshot/</url></snapshotRepository></distributionManagement></project>pom.xml
用于进行所有模块的管控
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dtstack</groupId><artifactId>knowledge-ai-chat</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>dt-ai-parent</module><module>dt-ai-bom</module><module>dt-ai-core</module><module>knowledge-common</module><module>knowledge-mcp-servers/zentao-mcp-server</module><module>knowledge-ai-server</module><module>knowledge-warehouse/knowledge-warehouse-base</module><module>knowledge-warehouse/knowledge-warehouse-yuque</module></modules><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><distributionManagement><repository><id>dtstack-release</id><url>http://nexus.dev.dtstack.cn/nexus/content/repositories/dtstack-release/</url></repository><snapshotRepository><id>dtstack-snapshot</id><url>http://nexus.dev.dtstack.cn/nexus/content/repositories/dtstack-snapshot/</url></snapshotRepository></distributionManagement></project>其他所有模块引入依赖

对于其他部分都继承dt-ai-parent模块:
<parent><groupId>com.dtstack</groupId><artifactId>dt-ai-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../dt-ai-parent/pom.xml</relativePath></parent><artifactId>knowledge-ai-server</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>3.3、工程模块统一版本依赖
参考:https://dtstack.yuque.com/rd-center/sm6war/bshbu5qqml1ypz7a
1、全局的pom中补充插件以及全局版本配置项

<groupId>com.dtstack</groupId><artifactId>knowledge-ai-chat</artifactId><version>${revision}</version><packaging>pom</packaging><properties><!-- 全局ai-chat模块管理 --><revision>1.2.0-SNAPSHOT</revision><maven.flatten.version>1.2.5</maven.flatten.version></properties><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>${maven.flatten.version}</version><configuration><flattenedPomFilename>pom-xml-flattened</flattenedPomFilename><updatePomFile>true</updatePomFile><flattenMode>resolveCiFriendliesOnly</flattenMode></configuration><executions><execution><id>flatten</id><phase>process-resources</phase><goals><goal>flatten</goal></goals></execution><execution><id>flatten.clean</id><phase>clean</phase><goals><goal>clean</goal></goals></execution></executions></plugin></plugins></build>2、所有的子模块,在进行parent标签设置的时候都使用${revision}

<parent><groupId>com.dtstack</groupId><artifactId>knowledge-ai-chat</artifactId><version>${revision}</version></parent>
<modelVersion>4.0.0</modelVersion><parent><groupId>com.dtstack</groupId><artifactId>dt-ai-parent</artifactId><version>${revision}</version><relativePath>../dt-ai-parent/pom.xml</relativePath></parent><dependencies><dependency><groupId>com.dtstack</groupId><artifactId>knowledge-warehouse-yuque</artifactId><version>${revision}</version></dependency></dependencies>对于parent也可使用revision变量,引入模块也可以使用,相当于全局参数通用。
资料获取
大家点赞、收藏、关注、评论啦~
精彩专栏推荐订阅:在下方专栏👇🏻
- 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
- 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
- 学习与生活-专栏:可以了解博主的学习历程
- 算法专栏:算法收录
更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅