Java 为什么gradle默认按模块名称顺序解析依赖项?
我有三个模块:Java 为什么gradle默认按模块名称顺序解析依赖项?,java,gradle,Java,Gradle,我有三个模块: amodule b模块 cmodule 这三个模块中都有集成测试。bmodule是基-它包含BaseClass,我想在amodule和cmodule中的集成测试中使用它 sourceSets { intTest { java { srcDir 'src/test-integration/java' } resources { srcDir 'src/test-integra
amodule
b模块
cmodule
bmodule
是基-它包含BaseClass
,我想在amodule
和cmodule
中的集成测试中使用它
sourceSets {
intTest {
java {
srcDir 'src/test-integration/java'
}
resources {
srcDir 'src/test-integration/resources'
}
compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
}
configurations {
intTestCompile {
extendsFrom compile
}
intTestRuntime {
extendsFrom runtime
}
}
dependencies {
intTestCompile project(path: ':bmodule', configuration: 'intTestCompile')
}
我的项目示例在github上:
我尝试在amodule
和cmodule
中为bmodule
的集成测试添加依赖项。
文件build.gradle
在模块amodule
和cmodule
sourceSets {
intTest {
java {
srcDir 'src/test-integration/java'
}
resources {
srcDir 'src/test-integration/resources'
}
compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
}
configurations {
intTestCompile {
extendsFrom compile
}
intTestRuntime {
extendsFrom runtime
}
}
dependencies {
intTestCompile project(path: ':bmodule', configuration: 'intTestCompile')
}
但是,当我尝试构建amodule
时,出现了一个错误:
Build file '/test-deps/amodule/build.gradle' line: 10
A problem occurred evaluating project ':amodule'.
> Could not get unknown property 'intTest' for SourceSet container of type org.gradle.api.internal.tasks.DefaultSourceSetContainer.
已成功完成cmodule
的构建,它是amodule
的副本
amodule
和cmodule
之间的唯一区别在于它们的名称。amodule
位于bmodule
之前,cmodule
之后是bmodule
sourceSets {
intTest {
java {
srcDir 'src/test-integration/java'
}
resources {
srcDir 'src/test-integration/resources'
}
compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
}
configurations {
intTestCompile {
extendsFrom compile
}
intTestRuntime {
extendsFrom runtime
}
}
dependencies {
intTestCompile project(path: ':bmodule', configuration: 'intTestCompile')
}
在本例中,如何指定一系列gradle resolve依赖项?我想让gradle先了解
b模块
,然后再了解amodule
和cmodule
试着把这个放到你的amdoule
的build.gradle中
sourceSets {
intTest {
java {
srcDir 'src/test-integration/java'
}
resources {
srcDir 'src/test-integration/resources'
}
compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
}
configurations {
intTestCompile {
extendsFrom compile
}
intTestRuntime {
extendsFrom runtime
}
}
dependencies {
intTestCompile project(path: ':bmodule', configuration: 'intTestCompile')
}
preBuild.dependsOn ":bmodule:build"
试着把这个放在你的
amdoule
的build.gradle中
preBuild.dependsOn ":bmodule:build"
您有一个项目评估排序问题。由于
amodule
和cmodule
都希望找到bmodule
的特定组件,因此您需要让Gradle确保首先对bmodule
进行了评估
您可以在amodule
和cmodule
的生成文件中添加以下内容:
evaluationDependsOn(':bmodule')
虽然Gradle提供了一个API来解决这个问题,但它只有在没有循环的情况下才能工作,也就是说,bmodule
既不依赖于amodule
也不依赖于cmodule
,否则您将无法通过这种方式找到解决方案
另一种方法是利用适当的依赖关系解析,并声明您希望共享一些测试类,例如,让它们共享。您有一个项目评估排序问题。由于
amodule
和cmodule
都希望找到bmodule
的特定组件,因此您需要让Gradle确保首先对bmodule
进行了评估
您可以在amodule
和cmodule
的生成文件中添加以下内容:
evaluationDependsOn(':bmodule')
虽然Gradle提供了一个API来解决这个问题,但它只有在没有循环的情况下才能工作,也就是说,bmodule
既不依赖于amodule
也不依赖于cmodule
,否则您将无法通过这种方式找到解决方案
另一种方法是利用适当的依赖关系解析,并声明您希望共享一些测试类,例如,通过使用它们。Gradle有三个构建阶段:
- 初始化
- 配置
- 执行
amodule
的配置时,它对bmudule
中的任何配置一无所知
在这个问题中,我想在configuration:amodule:intTest
中定义compileClasspath和runtimeClasspath。但是没有什么可以阻止我在自定义任务中定义它。Gradle将在第三阶段执行它,最终的compileClasspath和runtimeClasspath将包含来自b模块:intTest的信息
amodule
的结果build.gradle:
sourceSets {
intTest {
java {
srcDir 'src/test-integration/java'
}
resources {
srcDir 'src/test-integration/resources'
}
}
}
configurations {
intTestCompile {
extendsFrom compile
}
intTestRuntime {
extendsFrom runtime
}
}
task intTest {
sourceSets.intTest.compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
sourceSets.intTest.runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
Gradle有三个构建阶段:
- 初始化
- 配置
- 执行
但是,只有当gradle完成所有三个阶段时,才会出现解决所有依赖关系的最终结果
该错误指示源集中的字符串-它来自阶段配置。在该阶段开始时,gradle对所有模块中的任何配置一无所知。gradle按模块顺序学习每个模块的内容。当然,当gradle第一次考虑amodule
的配置时,它对bmudule
中的任何配置一无所知
在这个问题中,我想在configuration:amodule:intTest
中定义compileClasspath和runtimeClasspath。但是没有什么可以阻止我在自定义任务中定义它。Gradle将在第三阶段执行它,最终的CompileCasPath和runtimeClasspath将包含bmodule:intTest
amodule
的结果build.gradle:
sourceSets {
intTest {
java {
srcDir 'src/test-integration/java'
}
resources {
srcDir 'src/test-integration/resources'
}
}
}
configurations {
intTestCompile {
extendsFrom compile
}
intTestRuntime {
extendsFrom runtime
}
}
task intTest {
sourceSets.intTest.compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
sourceSets.intTest.runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
仍在获取错误“无法获取org.gradle.api.internal.tasks.DefaultSourceSetContainer类型的源集容器的未知属性“intTest”。“仍在获取错误”无法获取org.gradle.api.internal.tasks.DefaultSourceSetContainer类型的源集容器的未知属性“intTest”。”