Gradle Java插件和多项目:为什么jar任务不';你不依靠支票吗?

Gradle Java插件和多项目:为什么jar任务不';你不依靠支票吗?,gradle,Gradle,根据和图23.1,jar任务取决于classes任务 在我的场景中,我有一个包含三个项目的多项目—ProjectCommon、ProjectApp1和ProjectApp2。ProjectApp1依赖于ProjectCommon,ProjectApp2依赖于ProjectCommon 以下是ProjectApp1和ProjectApp2的build.gradle: dependencies { compile project(':ProjectCommon') }

根据和图23.1,jar任务取决于classes任务

在我的场景中,我有一个包含三个项目的多项目—ProjectCommon、ProjectApp1和ProjectApp2。ProjectApp1依赖于ProjectCommon,ProjectApp2依赖于ProjectCommon

以下是ProjectApp1和ProjectApp2的build.gradle:

dependencies {
    compile         project(':ProjectCommon')    
}
dependsOn(':ProjectCommon')
我现在不想只构建ProjectApp1,使用

$ gradle :ProjectApp1:build
输出显示,例如,未执行ProjectCommon的测试和检查:

:ProjectCommon:compileJava UP-TO-DATE
:ProjectCommon:processResources UP-TO-DATE
:ProjectCommon:classes UP-TO-DATE
:ProjectCommon:jar
:ProjectApp1:compileJava UP-TO-DATE
:ProjectApp1:processResources UP-TO-DATE
:ProjectApp1:classes UP-TO-DATE
:ProjectApp1:jar
:ProjectApp1:assemble
:ProjectApp1:compileTestJava UP-TO-DATE
:ProjectApp1:processTestResources UP-TO-DATE
:ProjectApp1:testClasses UP-TO-DATE
:ProjectApp1:test
:ProjectApp1:check
:ProjectApp1:build

BUILD SUCCESSFUL

Total time: 4.633 secs
ProjectApp1现在是在不知道ProjectCommon是否真的很好的情况下构建的

(当然,我可以改为使用gradle:ProjectCommon:build:ProjectApp1:build来避免这种情况)

如果jar通常依赖于检查,那么它不是“更安全”吗?

或者我对依赖项做了什么错误,我最好在ProjectApp1和ProjectApp2的build.gradle中使用:

dependencies {
    compile         project(':ProjectCommon')    
}
dependsOn(':ProjectCommon')

(这给出了一个弃用警告)

Gradle Java插件仅对某些任务使用项目编译依赖项,检查任务不在其中

在ProjectApp1中,添加

check {
    dependsOn ':ProjectCommon:check'
}

jar
任务不依赖于
check
任务,因为它们没有语义依赖关系——后者不会产生前者所消耗的任何东西

如果jar通常依赖于检查,这不是“更安全”吗

在某些情况下(例如Java编译),它会花费时间而不会变得更安全,在其他情况下(例如,在发布相关项目时,您希望在发布任何项目之前对所有项目进行测试),它也不够安全。使用Gradle,您可以根据特定需求定制行为


Java插件提供了一个
buildNeeded
任务,它在构建下游项目之前完全构建上游项目。以类似的方式,在将上游项目的产出用于下游项目之前,可以对其进行梯度测试。问题是这有多有用。

谢谢@Ingo Kegel!您认为如何将子项目{jar.dependsOn('check')}只添加到根目录下的build.gradle中?我不太明白这一点。但是您可以使用
subprojects{}
枚举根项目中的所有子项目,并根据需要添加依赖项。感谢Peter Niederwieser的解释。在我使用gradle之前,在所有测试/检查都是“绿色”之后,我习惯于在最后“jar”我的东西。对于gradle,“jar”直接依赖于“类”,这在Java插件文档的图23.1中有很好的说明。我只是需要改变一些旧习惯和我的想法…;-)