You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle构建jar替换resources指定资源时log4j2.xml丢失问题咨询

问题根因

  1. 配置作用域错误,排除规则未生效
    你写的exclude规则和duplicatesStrategy配置都嵌套在from jar { ... }的作用域内,仅对「jar任务本身的输出」这个额外引入的源生效,完全不会作用到jar任务默认读取的src/main/resources等标准源:
  • src/main/resources下的log4j2.xml仍会被默认打包到jar根目录
  • 你后续从distributions引入的同路径log4j2.xml,因为全局默认的重复策略优先级规则,被判定为重复文件直接丢弃
  1. 冗余的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:06:02