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 多模块项目未解决的引用错误的主要内容,如果未能解决你的问题,请参考以下文章
多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1
Spring boot 和 Gradle 多模块项目,无法正确加载依赖项
Spring Boot 多项目 Gradle --> 主类名未配置,无法解析