Problem with dependencyManagement and dependency versions

Viewed 39

I have problem with relations of pom, with dependency versions etc. Below my structure: My MAIN pom, which gives me the order to build of all projects

  <groupId>com.xyz</groupId>
  <artifactId>yxz</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>xyz</name>

  <modules>
    <module>commons</module>
    <module>projectA</module>
    <module>ProjectB</module>
    ...
    <module>ProjectX</module>
  </modules>

COMMONS pom, it is designed to have common dependencies and properties, without any parent

<groupId>com.xyz</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>

<name>commons</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.version>3.8.1</maven.compiler.version>
    <java.version>11</java.version>
    <lombok.version>1.18.24</lombok.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

ProjectA pom, include commons dependency, with spring-boot in parent,

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.xyz</groupId>
<artifactId>projectA</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>projectA</name>

<properties>
    <java.version>11</java.version>
    <spring-cloud.version>2021.0.0</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.xyz</groupId>
        <artifactId>commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    ...
    <dependency>
        some dependencies from org.springframework.cloud
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    ...
</build>

ProjectB pom, include commons dependency, with custom framework in parent,

<parent>
    <groupId>com.customframework</groupId>
    <artifactId>custom.framework</artifactId>
    <version>1.8.1</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.xyz</groupId>
<artifactId>projectB</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>projectB</name>

<properties>
    <java.version>11</java.version>
    <customeframework.feign.version>10.12</customeframework.feign.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.xyz</groupId>
        <artifactId>commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    ...
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-core</artifactId>
        <version>11.8</version>
    </dependency>
        other feign dependecies with 11.8 version
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.customframework</groupId>
            <artifactId>custom.framework.feign</artifactId>
            <version>${customeframework.feign.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    ...
</build>

When i build my all projects then:

  • projectA has lombok with version from springframework.cloud dependency management, not with version from commons
  • ProjectB has similar problem with feign, if i add feign dependency with version 11.8, maven use version from customframework (version 9.x)

What i want to do:

  • I tried add bom pom file, like next module to MAIN pom but how should i add it when i have other dependency management from springframework.cloud
  • i have 5-6 projects with spring boot parent, some with quarqus and with custom framework and i want configure all dependency versions and parent spring boot versions in one file
1 Answers

If you want to have the same dependencies in all modules then how about you define <dependencyManagement> with all required BOMs and versions in one place (e.g. in commons module)?

It won't bother the modules if they don't include some of the dependencies but it will make sure that all the modules have the same dependencyManagement rules.

Related