0

我在 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 存储库。如何正确地做到这一点?maven install

谢谢。

4

1 回答 1

1

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

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

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

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

于 2013-02-10T09:33:26.113 回答