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
此解决方案基于以下讨论:
我正在尝试使用 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
此解决方案基于以下讨论: