我在Grade中有一个多项目(多个java子项目),我计划将其上传到maven存储库(当前是本地存储库),包括sources
和javadoc
工件。我只需将以下代码添加到每个子项目中,然后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存储库。怎么做对了?
感谢。
答案 0 :(得分:1)
父项目的构建脚本在其子项目的构建脚本之前进行评估。当您将某些代码提升到父项目的构建脚本时,您必须确保评估顺序保持不变,即提升的代码不会急切地读取仅由子项目的构建脚本设置的属性。例如,如果子项目的构建脚本设置了javadoc.destinationDir
,则您必须提升该代码,或者推迟对父构建脚本中from javadoc.destinationDir
表达式的评估。
有几种推迟评估的技术。某些属性(如归档任务的from
和into
)接受闭包;因此你可以简单地做from { javadoc.destinationDir }
。另一种选择是使用gradle.projectsEvaluated {}
,project.afterEvaluate {}
或task.doFirst {}
等钩子。决定使用哪种技术的第一步是在Gradle Build Language Reference中查找有问题的属性。
如果没有看到更多的构建脚本,我最好的猜测是,您的特定问题与不将apply plugin: "java"
提升到父构建脚本的subprojects {}
块中有关。
配置注入的替代方法(例如,通过subprojects {}
)是将公共代码放入单独的构建脚本中,并使项目构建脚本包含具有apply from:
的代码。在某些情况下,这是一种比配置注入更容易(选择性地)共享代码的方法。通常,这两种方法一起使用。