将公共代码移动到`subprojects {}`块中断构建

时间:2013-02-10 08:03:15

标签: maven gradle artifacts multi-project

我在Grade中有一个多项目(多个java子项目),我计划将其上传到maven存储库(当前是本地存储库),包括sourcesjavadoc工件。我只需将以下代码添加到每个子项目中,然后maven install完成工作:

apply plugin: 'maven'

task sourcesJar(type: Jar, dependsOn:classes) {
        from sourceSets.main.allSource 
        classifier = 'sources' 
} 
task javadocJar(type: Jar, dependsOn:javadoc) {
        from javadoc.destinationDir 
        classifier = 'javadoc' 
}
artifacts { 
        archives jar
        archives sourcesJar 
        archives javadocJar 
}

现在在10个子项目中使用相同的代码并不是那么好,所以我决定将此代码移动到项目的subprojects { ... }配置中。但是,现在它不再起作用了:只构建空源和javadoc jar,忽略普通jar,maven install不再将文件复制到本地maven存储库。怎么做对了?

感谢。

1 个答案:

答案 0 :(得分:1)

父项目的构建脚本在其子项目的构建脚本之前进行评估。当您将某些代码提升到父项目的构建脚本时,您必须确保评估顺序保持不变,即提升的代码不会急切地读取仅由子项目的构建脚本设置的属性。例如,如果子项目的构建脚本设置了javadoc.destinationDir,则您必须提升该代码,或者推迟对父构建脚本中from javadoc.destinationDir表达式的评估。

有几种推迟评估的技术。某些属性(如归档任务的frominto)接受闭包;因此你可以简单地做from { javadoc.destinationDir }。另一种选择是使用gradle.projectsEvaluated {}project.afterEvaluate {}task.doFirst {}等钩子。决定使用哪种技术的第一步是在Gradle Build Language Reference中查找有问题的属性。

如果没有看到更多的构建脚本,我最好的猜测是,您的特定问题与不将apply plugin: "java"提升到父构建脚本的subprojects {}块中有关。

配置注入的替代方法(例如,通过subprojects {})是将公共代码放入单独的构建脚本中,并使项目构建脚本包含具有apply from:的代码。在某些情况下,这是一种比配置注入更容易(选择性地)共享代码的方法。通常,这两种方法一起使用。