2013-07-25 71 views
4

我想用Gradle替換WAR插件任務中的資源文件。Gradle用WAR插件替換資源文件

基本上我有兩個資源文件:

database.properties 
database.properties.production 

我想實現的是替代'database.properties'最終WAR文件下WEB 'database.properties.production' -INF /類

我嘗試了很多東西,但最合乎邏輯的我是不工作的情況如下:

war { 
     webInf { 
      from ('src/main/resources') { 
       exclude 'database.properties' 
       rename('database.properties.production', 'database.properties') 
       into 'classes' 
      } 
     } 
    } 

但是,這會導致所有其他資源文件是重複的,包括重複database.properties(二不同的文件具有相同的名稱),但仍然是database.properties.production在WAR中。

我需要一個乾淨的解決方案,沒有重複和WAR沒有database.properties.production。

回答

6

如果你不能在運行時決定(這是爲特定的環境配置的處理建議的最佳實踐),eachFile可能是你最好的選擇:

war { 
    rootSpec.eachFile { details -> 
     if (details.name == "database.properties") { 
      details.exclude() 
     } else if (details.name == "database.properties.production") { 
      details.name = "database.properties" 
     } 
    } 
} 

PS:搖籃1.7增加了filesMatching(pattern) { ... } ,這可能比eachFile更好。

+0

剛纔試了,它不工作。看起來它沒有效果。 :S –

+0

我更新了代碼並驗證了它的工作原理。簡而言之,改變不符合你需求的現有配置(在這種情況下,由'war'插件完成的配置)可能會非常棘手。有時最好以不同的方式解決問題。在這種情況下,一種替代方法是刪除'processResources.doLast' {...}中的「錯誤」文件(並重命名另一個文件)。或者你可以把文件放在src/main/resources以外的地方,並根據需要手動包含它們('war.webInf.from ...')。哪種解決方案最好取決於您的確切需求(IDE集成等)。 –

+0

它的工作。謝謝。我選擇這種方法的原因是它需要最少的工作。我不想將物業放在一個單獨的位置。使用這種方法,當我使用IDE時,我的代碼將在database.properties中查看測試數據庫,並且在生成我的WAR時,我知道我正在設置生產數據庫。 –

1

如果您想要一個適用於多個歸檔任務的解決方案,那麼您可以在執行processResources任務後修改「build/resources/main」中的屬性文件。我不確定這是否是一種公認​​的做法。我使用從build文件夾生成的兩個歸檔任務jar和par,所以這對我很有用。

此外,以下解決方案使用以「.production」結尾的所有文件。

我測試了這個解決方案與搖籃1.11

classes << { 
    FileTree tree = fileTree(dir: "build/resources/main").include("*.production") 
    tree.each { File file -> 
     String origName = file.name.substring(0, file.name.length() - ".production".length()) 
     File orig = new File(file.getParent(), origName) 
     orig.delete() 
     file.renameTo(orig) 
    } 
} 
相關問題