Spring Boot gradle 多模块项目未解决的引用错误

Posted

技术标签:

【中文标题】Spring Boot gradle 多模块项目未解决的引用错误【英文标题】:SpringBoot gradle multimodule project Unresolved reference error 【发布时间】:2021-01-09 13:58:46 【问题描述】:

我正在尝试在 gradle 上创建一个多模块 springboot 应用程序,但在构建期间我收到了 Unresolved reference 错误消息。各个模块的 Gradle 配置如下。

在构建期间导入 org.example.finalmultimodule.data.repositories.IPersonRepository 时出现未解决的引用错误:

错误:

目录树:

BuildTools > Gradle:

主构建.gradle:

plugins 
    id("org.springframework.boot") version "2.3.3.RELEASE"
    id("io.spring.dependency-management") version "1.0.10.RELEASE"
    kotlin("plugin.spring") version "1.4.10"
    kotlin("jvm") version "1.4.10"


group = "org.example"
version = "1.0-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories 
    mavenCentral()


// Projekty
project(":data") 
    apply(plugin = "org.springframework.boot")
    apply(plugin = "io.spring.dependency-management")


project(":business") 
    apply(plugin = "org.springframework.boot")
    apply(plugin = "io.spring.dependency-management")


project(":api") 
    apply(plugin = "org.springframework.boot")
    apply(plugin = "io.spring.dependency-management")


dependencies 
    // Moduly
    implementation(project(":core"))
    implementation(project(":data"))
    implementation(project(":business"))
    implementation(project(":api"))

    implementation(kotlin("stdlib"))


allprojects 
    tasks.withType<Test> 
        useJUnitPlatform()
    

    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> 
        kotlinOptions 
            freeCompilerArgs = listOf("-Xjsr305=strict")
            jvmTarget = "11"
        
    

核心 build.gradle:

plugins 
    kotlin("jvm")


group = "org.example"
version = "1.0-SNAPSHOT"

repositories 
    mavenCentral()


dependencies 
    // Anotace pro @JsonProperty
    implementation("com.fasterxml.jackson.core:jackson-annotations:2.11.2")

    implementation(kotlin("stdlib"))

数据构建.gradle:

plugins 
    kotlin("jvm")


group = "org.example"
version = "1.0-SNAPSHOT"

repositories 
    mavenCentral()


dependencies 
    // Moduly
    implementation(project(":core"))

    // Anotace @Component etc...
    implementation("org.springframework:spring-context")

    // Corutines
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")

    // Databaze
    implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
    implementation("io.r2dbc:r2dbc-mssql")

    implementation(kotlin("stdlib"))

业务构建.gradle:

plugins 
    kotlin("jvm")


group = "org.example"
version = "1.0-SNAPSHOT"

repositories 
    mavenCentral()


dependencies 
    implementation(project(":core"))
    implementation(project(":data"))

    // Kediatr variace na Mediatr
    implementation("com.trendyol:kediatr-spring-starter:1.0.14")

    implementation(kotlin("stdlib"))

API(springboot)build.gradle:

plugins 
    kotlin("jvm")
    kotlin("plugin.spring")


group = "org.example"
version = "0.0.1-SNAPSHOT"


repositories 
    mavenCentral()


dependencies 
    // Moduly
    implementation(project(":core"))
    implementation(project(":business"))

    // Kediatr variace na Mediatr
    implementation("com.trendyol:kediatr-spring-starter:1.0.14")
    
    implementation("org.springframework.boot:spring-boot-starter-rsocket")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")

    testImplementation("org.springframework.boot:spring-boot-starter-test") 
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    
    testImplementation("io.projectreactor:reactor-test")

【问题讨论】:

您确定是在编译期间而不是在应用启动期间吗?另外,你能发布目录树吗? (例如 IJ 树截图) 对我来说看起来不错,Kotlin 编译器也没有抱怨(代码中没有错误,否则你会看到红色下划线*)。您可以尝试通过 cli 使用 gradle 构建项目吗? (./gradlew bootRun)?另外,您在File | Settings | Build, Execution, Deployment | Build Tools | Gradle 中的Build and run 设置是什么。我唯一担心的是我在目录树屏幕截图中看不到 gradle.settings 。你有吗? * - 除非项目没有正确导入 @mightybruno 是的,我的项目中有 gradle.settings。 ./gradle bootRun 以同样的错误结束。我添加了 BuildTools > Gradle 的屏幕 尝试切换 build and run 以使用 IDEA 而不是 gradle。此外,当我遇到这样的奇怪事情时,我总是会做一些事情:./gradlew clean,使缓存无效,删除.idea 文件夹,还有一次我的 gradle 依赖项在~/.gradle 中损坏并且不得不删除它 问题是你把所有东西都做成了 Spring Boot 项目,我怀疑它们是。 Spring Boot fat jar 具有特殊的结构,并且类不在默认位置。只有应该引导所有内容的项目(带有 @SpringBootApplication 注释类的项目)应该应用 spring-boot 插件。所有其他的应该是常规的 java 项目。 【参考方案1】:

我有一个非常相似的情况,即使在 IntelliJ 中一切看起来都很好,我来自其他模块的类也无法解析。

我设法通过显式添加来解决它

@ComponentScan(basePackages = ["my.package"])

到我的 Spring Boot 应用程序。

另外,像这样设置库项目:

tasks.findByName("bootJar")?.apply 
    enabled = false


tasks.findByName("jar")?.apply 
    enabled = true

【讨论】:

你是我的救命恩人。

以上是关于Spring Boot gradle 多模块项目未解决的引用错误的主要内容,如果未能解决你的问题,请参考以下文章

使用Spring Boot Gradle插件的多模块项目

多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1

Spring boot 和 Gradle 多模块项目,无法正确加载依赖项

Spring Boot 多项目 Gradle --> 主类名未配置,无法解析

使用 Spring Boot 从 Gradle 多模块项目构建的 Jar 不起作用

无法集成测试 gradle 多模块 Spring-Boot-Application