Gradle构建jar替换resources指定资源时log4j2.xml丢失问题咨询
问题根因
- 配置作用域错误,排除规则未生效
你写的exclude规则和duplicatesStrategy配置都嵌套在from jar { ... }的作用域内,仅对「jar任务本身的输出」这个额外引入的源生效,完全不会作用到jar任务默认读取的src/main/resources等标准源:
src/main/resources下的log4j2.xml仍会被默认打包到jar根目录- 你后续从
distributions引入的同路径log4j2.xml,因为全局默认的重复策略优先级规则,被判定为重复文件直接丢弃
- 冗余的
from jar配置引入逻辑混乱jar任务本身已经默认包含了编译后的类、资源文件等所有标准输入,额外添加from jar相当于把jar任务的输出又作为输入源,只会引入不必要的重复文件冲突。
至于persistence.xml可以正常显示,是因为你引入该文件时指定了into 'META-INF',路径匹配逻辑和全局默认的资源打包逻辑优先级适配,没有触发重复排除规则。
修复方案
直接对jar任务做全局配置即可,正确写法如下:
import org.apache.tools.ant.filters.ReplaceTokens // 注意顶部导入ReplaceTokens,避免运行报错 jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 全局排除默认资源目录下的两个目标文件,作用于所有输入源 exclude('META-INF/persistence.xml') exclude('log4j2.xml') // 引入distributions下的替换文件 from('distributions/persistence.xml'){ into 'META-INF' filter(ReplaceTokens, tokens: [TEST_PARAM: 'tmp_value1']) } from('distributions/log4j2.xml') { // 无需额外指定into,默认输出到jar包根目录,和原文件路径一致 filter(ReplaceTokens, tokens: [TEST_PARAM: 'tmp_value1']) } }
如果需要提前在资源处理阶段过滤不需要的文件,也可以添加如下配置替代jar任务的全局exclude规则,执行效率更高:
processResources { exclude 'META-INF/persistence.xml' exclude 'log4j2.xml' }
内容的提问来源于stack exchange,提问作者Manolis P.
相关产品推荐
相关产品推荐

