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有三个构建阶段:

  • 初始化
  • 配置
  • 执行
但是,只有当gradle完成所有三个阶段时,才会出现解决所有依赖关系的最终结果

该错误指示源集中的字符串-它来自阶段配置。在该阶段开始时,gradle对所有模块中的任何配置一无所知。gradle按模块顺序学习每个模块的内容。当然,当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”。”