2017-04-16 82 views
1

我正在使用Gradle構建一個涉及本機庫的Java項目。我有定義的任務jniHeaders如何追加一個Gradle任務而不使用`dependsOn`?

jniHeaders.dependsOn classes 

所以當我輸入gradle jniHeaders,它將編譯Java類和生成JNI頭。到現在爲止還挺好。

但我覺得打字gradle jniHeaders不是很自然。 99%的時間,如果你成功編譯Java類,你也想生成JNI頭文件。如果我可以用gradle classes編譯Java類並在一個步驟中生成JNI頭文件,那將會很好。

換句話說,我想任務jniHeaders添加到任務classes結束,但前提是classes成功地完成,實際上做了一些工作。

classes.doLast想起來,但我無法告訴它執行另一項任務。 classes.finalizedBy jniHeaders在某種程度上起作用,但生成JNI標頭,無論classes的結果如何。我想我可以添加一些Groovy邏輯來獲得我想要的確切行爲,但我也懷疑必須有一種更簡單的方法。

任何人有任何建議嗎?

+0

是否調用多數民衆贊成竊聽你一個看似隨意的任務只是概念?我可能會試圖定義另一個任務'allTheThings'(或其他任何!),它們只依賴於'classes'和'jniHeaders'。這似乎比添加精品構建邏輯簡單得多:) –

回答

1

將構建模型化爲任務圖的重點在於存在一個簡單且健壯的執行模型。我建議你創建一個函數compileJNIHeaders(),並把它放在Gradle可以訪問的地方(build.gradle本身以及buildSrc/src/main/groovy),這樣你就可以輕鬆開發和測試它。

此功能可以在最適當的步驟來執行:

  • classes.doFirst(如果標題是您自己的代碼)
  • classes.doLast(如果標題是依賴項目)
  • 放於一個任務compileJNIHeaders,它是您用於將項目打包爲其部署格式的任務的依賴關係
+0

謝謝。我試圖操縱依賴關係圖,並忘記了最簡單的模塊化方法。 –

1

y有兩個部分我們的問題:

  1. 添加任務jniHeaders成功編譯java類後執行。
  2. 只有在完成任何工作後才執行jniHeaders任務。

由於classes任務是processResourcescompileJava的組件(見java plugin doc),我認爲這是更好地鉤到compileJava任務。正如你發現你自己,這可以用finalizedBy完成。另外,如果沒有完成工作,則需要跳過該任務,例如,通過在您的jniHeaders任務中添加onlyIf聲明。

例子:

task jniHeaders { 
    onlyIf { !sourceSets.main.allJava.empty } 
    doLast { 
     println "GENERATE JNI HEADERS for $project.name" 
    } 
} 
compileJava.finalizedBy jniHeaders 
+0

謝謝。但是我嘗試了你的代碼,它並沒有像預期的那樣工作。即使'compileJava'失敗,'jniHeader'仍然會被執行,因爲大概'allJava'不是空的! (我沒有從一個乾淨的構建目錄開始)無論如何,我採用了@ Raffaele的解決方案。感謝您的建議。 –