Gradle: 从资源中排除文件并从不同的文件夹添加它

Gradle: Exclude file from resourses and add it from different folder

我正在尝试使用 Gradle 构建一个 jar 文件。 我有一些资源文件(比如 log4j2 和 persistent.xml)到 src/main/resources 我想在构建 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)。 当我提取罐子时,我可以找到 persistence.xml 但找不到 log4j2.xml.

我的问题是,为什么会这样?

(PS)

如果我将 (1)、(2) 替换为

processResources.exclude('*')

将 persistence.xml 而非 log4j2.xml.

放入 jar 中

提前致谢。

根据 this documentation任何排除模式都会覆盖任何包含,因此如果文件或目录至少匹配一个排除模式,则无论包含模式如何,它都不会被包含.

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