所以我在kotlin得到了一个由多个子项目组成的项目。它们都是与单个settings.gradle文件链接的。这一切都很好,直到一周后编码的另一部分,我注意到,我从一个模块获得了大量的编译错误。因此,我开始挖掘,发现Intellij无法从另一个子项目导入类,即使它通过api project(':lib:content:model')依赖于它。我不知道为什么它停止工作,试图在没有intellij的情况下构建这个项目,只是使用graddlew。然后我发现了奇怪的错误:
命令:./gradlew :lib:game:model:build
FAILURE: Build failed with an exception.
* What went wrong:
Circular dependency between the following tasks:
:lib:game:model:classes
\--- :lib:game:model:compileJava
+--- :lib:game:model:compileKotlin
| +--- :lib:game:model:jar
| | +--- :lib:game:model:classes (*)
| | +--- :lib:game:model:compileJava (*)
| | +--- :lib:game:model:compileKotlin (*)
| | \--- :lib:game:model:kaptKotlin
| | +--- :lib:game:model:jar (*)
| | \--- :lib:game:model:kaptGenerateStubsKotlin
| | \--- :lib:game:model:jar (*)
| \--- :lib:game:model:kaptKotlin (*)
\--- :lib:game:model:jar (*)
(*) - details omitted (listed previously)我试着用谷歌搜索它,但互联网上的任何建议对我都没有用。最奇怪的是,它曾经在我以前写的时候起作用。然后我切换到另一个模块,当我回来的时候,就像这样,坏了=
我试图将被窃听的代码隔离到测试中,最后得到了包含两个子模块content和game的content模块。另一个是project-types模块,我在其中存储gradle插件以克服配置重复。content项目只有一个子项目名为model,game项目有三个子项目:api、impl和还有'model`‘。
lib->game->model项目依赖于lib->content->model lib->game->impl项目依赖于lib->game->api
因此,另一件非常奇怪的事情是,即使lib->game->impl依赖于lib->game->api,它也能很好地工作和编译。但是对于使用相同机制依赖于‘lib->内容->模型’的‘lib->游戏->模型,同样的事情不起作用。
所以我迷路了,不知道该怎么办。有一个很好的理由,我需要他们都是不同的项目,但我不想让自己在地狱中发布新的工件到本地回购每次我改变代码在其中之一。有人能帮我把它修好吗
我的./gradlew -q projects输出:
------------------------------------------------------------
Root project 'test'
------------------------------------------------------------
Root project 'test'
\--- Project ':lib'
+--- Project ':lib:content'
| \--- Project ':lib:content:model'
\--- Project ':lib:game'
+--- Project ':lib:game:api'
+--- Project ':lib:game:impl'
\--- Project ':lib:game:model'
Included builds
\--- Included build ':project-types'project-types包含common和kotlin-project子项目。
common build.gradle:
plugins {
id 'groovy-gradle-plugin'
}
repositories {
mavenCentral()
}和src中的commons.gradle文件:
plugins {
id 'java'
}
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
implementation 'com.fasterxml.jackson.core:jackson-core:2.13.4'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.4'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.4'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.4'
implementation 'com.fasterxml.jackson.module:jackson-module-paranamer:2.13.4'
implementation 'org.slf4j:slf4j-api:1.7.36'
implementation 'ch.qos.logback:logback-classic:1.2.11'
implementation 'commons-io:commons-io:2.11.0'
implementation 'org.apache.commons:commons-lang3:3.12.0'
implementation 'commons-codec:commons-codec:1.15'
}kotlin-project build.gradle文件:
dependencyResolutionManagement {
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
google()
}
}
rootProject.name = 'project-types'
include 'commons'
include 'kotlin-project'它是src中的kotlin-project.gradle文件:
plugins {
id 'commons'
id 'org.jetbrains.kotlin.jvm'
id 'org.jetbrains.kotlin.kapt'
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
implementation 'org.jetbrains.kotlin:kotlin-reflect'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.6.4'
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1'
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.9.1'
testImplementation 'org.mockito:mockito-junit-jupiter:4.8.1'
testImplementation 'org.mockito.kotlin:mockito-kotlin:4.0.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1'
}
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions.jvmTarget = '17'
kotlinOptions.freeCompilerArgs = ['-Xjsr305=strict', '-Xemit-jvm-type-annotations']
}
compileTestKotlin {
kotlinOptions.jvmTarget = '17'
kotlinOptions.freeCompilerArgs = ['-Xjsr305=strict', '-Xemit-jvm-type-annotations']
}
kapt {
correctErrorTypes = true
}所以我的主要项目结构是:
我的./setting.gradle文件内容:
rootProject.name = 'test'
includeBuild 'project-types'
include 'lib:game'
include 'lib:game:model'
include 'lib:game:api'
include 'lib:game:impl'
include 'lib:content'
include 'lib:content:model'./build.gradle文件内容
plugins {
id 'org.jetbrains.kotlin.jvm' version "1.7.21" apply false
id 'org.jetbrains.kotlin.kapt' version "1.7.21" apply false
}
repositories {
mavenCentral()
}./lib/content/model/build.gradle文件内容:
plugins {
id 'kotlin-project'
}
group 'cvazer.test'
version '1.0.0'
dependencies {
}./lib/game/api/build.gradle文件内容:
plugins {
id 'kotlin-project'
}
group 'cvazer.test'
version '1.0.0'
dependencies {
}./lib/game/impl/build.gradle文件内容:
plugins {
id 'kotlin-project'
}
group 'cvazer.test'
version '1.0.0'
dependencies {
api project(':lib:game:api')
}./lib/game/model/build.gradle文件内容:(有问题的)
plugins {
id 'kotlin-project'
}
group 'cvazer.test'
version '1.0.0'
dependencies {
api project(':lib:content:model')
}发布于 2022-11-28 23:48:17
如果两个子项目名称相同,即使路径不同,Gradle也有解决依赖关系的问题。
你有两个子项目,都叫做“模型”
:lib:game:model:lib:content:model格拉德尔无法区分他们。
我建议将您的子项目重命名为更漂亮,不嵌套,并使每个子项目的名称都是唯一的。
└── lib/
├── game
├── game-model
├── game-api
├── game-impl
├── content
└── content-modelhttps://stackoverflow.com/questions/74603267
复制相似问题