Java通用工程模块bom包管理详细代码示例

 更新时间:2026年06月04日 09:22:38   作者:长路 ㅤ  
BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有这一个部分,这篇文章主要介绍了Java通用工程模块bom包管理的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、什么是bom包?

BOM 的全称是 Bill Of Materials(材料清单)。

在软件开发的语境下,特别是在 Maven 中,BOM 是一个特殊的 POM(Project Object Model)文件。它的核心作用是统一管理一组相互关联的依赖库的版本,确保这些依赖的版本是相互兼容的,从而避免版本冲突。

您可以把它想象成一个依赖版本目录版本说明书

二、BOM 的用途和优势

用途:

  1. 解决版本冲突:大型项目或微服务架构中,会引入大量第三方库。这些库自身又可能依赖其他库(传递性依赖)。如果不同模块对同一个传递依赖的版本要求不一致,就会导致版本冲突。BOM 由官方或社区维护,它定义了所有相关依赖的“经过测试且彼此兼容”的版本。
  2. 简化依赖管理:使用 BOM 后,在项目中声明依赖时,无需再指定版本号**<version>** 标签)。版本号由 BOM 统一提供。这使得 POM 文件更加简洁,并且所有模块使用的版本高度一致。
  3. 保证兼容性和稳定性: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"?>
<project xmlns="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"?>
<project xmlns="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>info@langchain4j.dev</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"?>
<project xmlns="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"?>
<project xmlns="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"?>
<project xmlns="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"?>
<project xmlns="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通用工程模块bom包管理的文章就介绍到这了,更多相关Java工程模块bom包管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何基于command调用openssl生成私钥证书

    Java如何基于command调用openssl生成私钥证书

    这篇文章主要介绍了Java如何基于command调用openssl生成私钥证书,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot整合MyBatis-Plus的示例代码

    SpringBoot整合MyBatis-Plus的示例代码

    这篇文章主要介绍了SpringBoot整合MyBatis-Plus的示例代码,使用 MyBatis-Plus 可以减少大量的开发时间,单表的增删改查可以不用写 sql 语句,本文主要介绍整合需要主要事项,需要的朋友可以参考下
    2022-03-03
  • 若依 MyBatis改为MyBatis-Plus的实现步骤

    若依 MyBatis改为MyBatis-Plus的实现步骤

    本文主要介绍了若依 MyBatis改为MyBatis-Plus的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • IDEA常用插件之类Jar包搜索Maven Search解读

    IDEA常用插件之类Jar包搜索Maven Search解读

    文章介绍了IDEA常用插件MavenSearch的使用方法,该插件可以帮助用户快速查找和浏览Maven中央存储库中可用的依赖项和插件,方便用户管理项目依赖项
    2025-01-01
  • Spring 依赖注入、AOP代理全方面解析

    Spring 依赖注入、AOP代理全方面解析

    文章介绍了软件开发中的开闭原则、依赖倒置原则及Spring非侵入式设计,通过IoC和DI实现解耦,提升系统扩展性、可测试性及架构迁移能力,强调框架能力以无感知方式注入业务代码的核心优势,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-08-08
  • java web在高并发和分布式下实现订单号生成唯一的解决方案

    java web在高并发和分布式下实现订单号生成唯一的解决方案

    这篇文章主要介绍了java web在高并发和分布式下实现订单号生成唯一的解决方案,需要的朋友可以参考下
    2017-11-11
  • SpringBoot项目离线环境手动构建的过程

    SpringBoot项目离线环境手动构建的过程

    文章介绍了如何在IntelliJ IDEA中手动创建一个Spring Boot项目,并详细讲解了pom.xml文件的配置和基本项目结构的设置,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • spring IOC容器的Bean管理XML自动装配过程

    spring IOC容器的Bean管理XML自动装配过程

    这篇文章主要为大家介绍了spring IOC容器Bean管理基于XML的自动装配过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 详解Java-Jackson使用

    详解Java-Jackson使用

    这篇文章主要介绍了Java-Jackson使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot静态资源及原理解析

    SpringBoot静态资源及原理解析

    这篇文章主要介绍了SpringBoot静态资源及原理解析,当创建一个jar工程时,想引入css等静态资源时,需要遵守SpringBoot的静态资源映射关系,通过WebMvcAutoConfiguration查看静态配置资源的规则,需要的朋友可以参考下
    2023-12-12

最新评论