带有'doLast'的空源jar,搞砸了没有

时间:2016-03-04 12:29:35

标签: java gradle

我在build.gradle中有一个任务,看起来像这样:

task sourceJar(type: Jar, dependsOn: classes) << {
  classifier = 'sources'
  from sourceSets.main.allSource
}

运行gradle sourceJar会在libs /中创建一个jar文件,但它是空的(不包含任何源,只包含清单)。 删除<<由于某种原因修复了它,jar被正确创建,但搞砸了其他东西(子项目现在失去了专门为它们定义的编译依赖项)。

那么,这里有三个(也许是四个?)问题: (1)怎么了?使用<<定义任务时,为什么sourceSets为空? (2)为什么删除<<修复它?我的理解是,它只是使块的内部每次都“内联”执行,而不仅仅是在任务被特别强制执行时。 (3)如何解决这个问题?我不能只删除<<,因为,正如我所说,它搞砸了其他事情(但请参阅问题#4)。 (4)为什么删除<<搞砸子项目?这是预期的吗? 澄清一下,这就是我所说的:

subprojects {
 apply plugin: 'java'
 dependencies {
   compile project(':a')
 }

 task  cp  << {
  println ("PROJECT " + project.name + ">> " + sourceSets.main.runtimeClasspath.collect { it.absolutePath }.join(':'))
 }
}

project(':b') {
  dependencies {
   compile project(':c')
  }
}

正在运行gradle -q b:cp打印

PROJECT b>> b/build/classes/main:b/build/resources/main:a/build/libs/a.jar:c/build/libs/c.jar

(我删除了绝对路径)。这就是我要的。

现在,如果我从文件中删除<<,然后再次运行gradle -q b:cp,我就会知道

PROJECT a>> a/build/classes/main:a/build/resources/main:/a/build/libs/a.jar
PROJECT b>> b/build/classes/main:b/build/resources/main:a/build/libs/a.jar
PROJECT c>> c/build/classes/main:c/build/resources/main:a/build/libs/a.jar

这有两个方面是错误的:首先,我没有要求它为所有三个子项目运行,仅针对b,其次,请注意b没有c在它的类路径中。

有人可以帮我弄清楚这里发生了什么......我真的要放弃并切换到sbt(是的,这是一种威胁!)。

1 个答案:

答案 0 :(得分:1)

当您声明类型为Jar的任务时,您不必使用<<,因为您有效地扩展了已正确声明所有必需<<的jar任务。但首先,您需要了解<<的含义以及Gradle的配置和执行阶段。

请在此处查看彼得的答案:Why is my Gradle task always running?

<<doLast的{​​{1}}的简写速记,任何未包含在doLast中或未被<<注释的任务代码都在配置阶段而非执行阶段。这可能会导致您的printlns例如在未明确调用任务时执行,因为即使未执行任务也会配置所有任务)

其次,您的cp任务不是扩展任务类型。所以在其定义中需要 <<

 task  cp  << { ... }