Home > Software engineering >  Gradle Spring Boot Dependency Not found Multi Module Project
Gradle Spring Boot Dependency Not found Multi Module Project

Time:08-24

I am trying to set up multimodule project

RootProject Settings

rootProject.name = 'Abc'

include 'catalog'
include 'catalog-common'

Root Project Abc/build.gradle

plugins {
    id 'org.springframework.boot' version '2.7.3' apply false
    id 'io.spring.dependency-management' version '1.0.13.RELEASE'
    id 'java'
}

subprojects {

    group = 'com.abc'

    apply plugin: 'java'
    apply plugin: 'io.spring.dependency-management'

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }


    dependencyManagement {
        imports {
            mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:2021.0.3"
        }
    }

    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }

    repositories {
        mavenLocal()
        mavenCentral()
    }


    dependencies {
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
    }

}

Module catalog-common

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation('org.springframework.boot:spring-boot-starter-validation')
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Module Catalog

plugins {
    id 'org.springframework.boot' version '2.7.3'
}

dependencies {
    implementation project(':catalog-common')
}

in Catalog Project it is expecting again to define spring dependencies but where as I am able to access java static classes

Please help

CodePudding user response:

It looks like your catalog-common is a kind of "library" module, consumed by other sub-projects (catalog and maybe others). If so, you should use the Java Library plugin which can be used for this purpose. You will then need to configure all dependencies you want to "inherit" in consumer projects using api configuration instead of implementation. Dependencies declared in implementation will not leak into consumer projects, this is the expected Gradle behavior.

In you example, catalog-common build script should look like:

plugins {
    id("java-library")
}
dependencies {
    // choose between api or implementation, depending on the scope you want for each dependency
    api 'org.springframework.boot:spring-boot-starter'
    api 'org.springframework.boot:spring-boot-starter-actuator'
    api 'org.springframework.boot:spring-boot-starter-web'

    implementation('org.springframework.boot:spring-boot-starter-validation')
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    implementation 'org.springframework.boot:spring-boot-starter-test'
}

Please note that it seems a bit strange to configure some of the Spring dependencies like actuator in this common library: this should declared only in the main "application" project ( catalog in your case), unless you want to implement some common code depending on actuator in the catalog-common module.

  • Related