簡體   English   中英

Gradle:從資源中排除文件並從不同的文件夾添加它

[英]Gradle: Exclude file from resourses and add it from different folder

我正在嘗試使用 Gradle 構建 jar 文件。 我在構建 jar 時想要排除的 src/main/resources 中有一些資源文件(如 log4j2 和 persistent.xml),相反我有相同的文件(在項目目錄中具有不同的內容)並且我想要復制這些文件而不是 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。

提前致謝。

根據本文檔任何排除模式都會覆蓋任何包含,因此如果文件或目錄與至少一個排除模式匹配,則無論包含模式如何,它都不會被包含。

您觀察到的行為似乎是由 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

該解決方案基於以下討論:

  1. https://discuss.gradle.org/t/how-to-override-where-some-files-are-written-to-in-the-jar-file/5282
  2. 如何強制 Gradle 覆蓋自定義 WAR 任務中的資源文件?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM