如何在 Maven 多模块项目中使用 BOM 文件?

问题描述

Java 11,Maven 3.8.3

我在 pom 文件中的 Java Maven 项目:

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-framework-bom</artifactId>
      <version>4.3.8.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

这里是我的班级:

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Module1
 */
public class App {
    private static Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        logger.debug("Module1,JDK: " + System.getProperty("java.version"));

        // Use lib commons-lang3
        logger.debug("lib: commons-lang3: isEmptyString = " + StringUtils.isEmpty(""));
    }
}

但是在 mvn install 之后我得到错误:

[INFO] 正在扫描项目...
[ERROR] [ERROR] 在处理 POM 时遇到一些问题:
[错误] 缺少 org.apache.commons:commons-lang3:jar 的“dependencies.dependency.version”。 @ 第 15 行,第 17 列

如果我打开它存在的 BOM 文件:

<commons-dbcp2.version>2.7.0</commons-dbcp2.version>
<commons-lang3.version>3.9</commons-lang3.version>
<commons-pool.version>1.6</commons-pool.version>

为什么 Maven 在 BOM 文件中找不到正确的 commons-lang3.version 版本号?

解决方法

我解决了这个问题。 在父级的 POM 中使用:

 <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-dependencies</artifactId>
          <version>2.4.4</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>

在模块的 POM 中使用(示例):

  <dependencies>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

如您所见,没有明确设置库的版本号。版本号从 BOM 文件中得到隐含。

不错!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...