Alexei
Alexei

Reputation: 15656

How use BOM file in Maven multi modules project?

Java 11, Maven 3.8.3

I my Java Maven project in pom file:

  <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>

And here my class:

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(""));
    }
}

But after mvn install I get error:

[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] 'dependencies.dependency.version' for org.apache.commons:commons-lang3:jar is missing. @ line 15, column 17

If I open BOM file it exist:

<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>

Why Maven not found correct version number of commons-lang3.version in BOM file?

Upvotes: 0

Views: 1515

Answers (1)

Alexei
Alexei

Reputation: 15656

I fix the problem. In parent's POM use:

 <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>

And in modules's POM use (example):

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

As you can see no explicit set version numbers of libraries. The version numbers get implicit from BOM file.

Nice!

Upvotes: 0

Related Questions