我正在嘗試使用 Gradle 構建一個 jar 檔案。我在 src/main/resources 中有一些資源檔案(如 log4j2 和persistent.xml),我想在構建 jar 時排除這些檔案,相反,我有相同的檔案(在專案目錄中具有不同的內容)并且我想要復制這些檔案而不是 src/main/resource 檔案。
進入我的 gradle.build
from jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
// The parent folder is: src/main/resources for the (1) and (2)
exclude('META-INF/persistence.xml') // (1)
exclude('log4j2.xml') // (2)
from('distributions/persistence.xml'){ // (3)
into 'META-INF'
filter(ReplaceTokens, tokens: [TEST_PARAM: 'tmp_value1'])
}
from('distributions/log4j2.xml') { // (4)
filter(ReplaceTokens, tokens: [TEST_PARAM: 'tmp_value1'])
}
}
所以我手動排除了這兩個檔案(1),(2),然后我添加了(3),(4)。當我提取 jar 時,我可以找到 persistence.xml 但找不到 log4j2.xml。
我的問題是,為什么會發生這種情況?
(附注)
如果我將(1),(2)替換為
processResources.exclude('*')
在 jar 中放置了persistence.xml而不是log4j2.xml。
提前致謝。
uj5u.com熱心網友回復:
根據本檔案:任何排除模式都會覆寫任何包含,因此如果檔案或目錄至少匹配一個排除模式,則無論包含模式如何,它都不會被包含在內。
您觀察到的行為似乎是由 gradle 處理檔案排除的方式引起的。您這樣做的方式適用于復制到 jar 檔案中的子檔案夾的檔案。出于某種原因,它不適用于復制到 jar 檔案根檔案夾的檔案。
您可以使用此配置實作您想要的:
jar {
from('distributions') {
include("**/*.xml")
}
eachFile {
if (it.file.path =~ "build/resources/main/") {
// exclude resources copied from build/resources/main/
it.exclude()
}
}
}
這是我使用的專案樹,因為我的可能與您正在處理的專案不同:
├── build.gradle
├── distributions
│ ├── META-INF
│ │ └── persistence.xml
│ └── log4j2.xml
└── src
└── main
├── java
│ └── Main.java
└── resources
├── META-INF
│ └── persistence.xml
└── log4j2.xml
此解決方案基于以下討論:
- https://discuss.gradle.org/t/how-to-override-where-some-files-are-written-to-in-the-jar-file/5282
- 如何強制 Gradle 在自定義 WAR 任務中覆寫資源檔案?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367797.html
