2016-03-04 26 views
0

我在的build.gradle任务,看起来像这样:空源JAR搞砸了子项目的依赖没有

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

运行gradle sourceJar创造了林达一个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

当您声明类型为Jar的任务时,不必使用<<,因为您正在有效地扩展jar任务,该任务已正确声明了所有必需的<<。但首先它听起来像你需要阅读什么<<意味着什么和关于gradle的配置和执行阶段。

请参阅彼得的答案在这里:Why is my Gradle task always running?

<<doLast没有被封闭在doLast<<在配置阶段执行,而不是执行阶段没有被标注任何任务的gradle代码速记。这可能会导致您的printlns例如在任务未被明确调用时执行,因为即使未执行任务也会配置所有任务)

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

task cp << { ... } 
+0

好的,这有助于,谢谢!我知道'<<'的含义是什么,抛弃我的是,用(几乎)相同的语法,有时候你需要它,有时你不需要它:)我仍然不确定为什么'顺便说一下,在jar任务中的“<<”会把它弄糟。你解释了为什么我不需要它,但不是为什么我不能拥有它。 – Dima