2016-03-04 41 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