xml文件未进jar是因为maven默认只处理src/main/resources目录,若放在其他路径(如src/main/config)需在pom.xml中通过显式配置对应及规则。

为什么 resources 目录下的 XML 文件没进 JAR?
默认情况下,Maven 只把 src/main/resources 下的文件复制进 target/classes,再打包进 JAR;但如果你把 XML 放在别的路径(比如 src/main/config 或 src/main/xml),它根本不会被扫描——不是打包失败,是压根没被发现。
常见错误现象:java.lang.ClassNotFoundException 或 getResourceAsStream("xxx.xml") 返回 null,查 jar -tf your-app.jar 确实没有那个文件。
- 确认 XML 是否真在
src/main/resources下;如果不是,必须显式配置<resources></resources> - Maven 不识别
.xml为“非资源”,它只认目录位置和<includes></includes>规则 - IDE(如 IntelliJ)可能自动刷新 classpath,但
mvn package不会——以命令行为准
如何用 <build><resources></resources></build> 包含自定义 XML 路径?
在 pom.xml 的 <build></build> 块里加 <resources></resources>,告诉 Maven:“这些目录也当资源处理”。关键不是“加 XML”,而是“加路径”。
示例:要把 src/main/config/ 下所有 .xml 和 .properties 打进去:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/config</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
- 每个
<resource></resource>是独立路径,<includes></includes>只对当前<directory></directory>生效 - 不写
<includes></includes>就全量包含(包括子目录下所有文件),但建议显式限定,避免误打测试数据或临时文件 -
<directory></directory>必须是相对pom.xml的路径,不能用../向上跳转
XML 文件被过滤(filtering)后格式错乱怎么办?
如果启用了 <filtering>true</filtering>,Maven 会尝试替换 ${xxx} 占位符——这对 properties 文件有用,但对 XML 容易破坏结构(比如把 <bean></bean> 里的 ${id} 替换掉,或误解析 CDATA)。
- 默认
<filtering></filtering>是false,只有你主动设为true才会触发 - 如果 XML 里真有需要替换的变量(如环境相关 URL),单独为它开一个
<resource></resource>并设<filtering>true</filtering>,其他 XML 保持false - 常见症状:JAR 里 XML 出现空行、标签截断、
<实体化——基本就是 filtering 搞的鬼
打包后 XML 在 JAR 里的路径和代码中 getResource 怎么对应?
Maven 把资源复制到 target/classes 时,保留原始子目录结构;JAR 里路径 = src/main/resources 或你配置的 <directory></directory> 下的相对路径。代码里必须按这个路径找。
比如 XML 在 src/main/resources/conf/app-config.xml,那运行时要用:
getClass().getResource("/conf/app-config.xml") // 开头带 / 表示从 classpath 根开始
// 或
getClass().getResourceAsStream("/conf/app-config.xml")
- 路径区分大小写,Linux/CI 环境下尤其容易因大小写不一致导致
null - 不要写成
src/main/resources/conf/app-config.xml——那是开发路径,不是 classpath 路径 - 如果 XML 在
src/main/config/app.xml且你已配好<resource></resource>,那路径就是/app.xml(因为src/main/config是根级目录)
最常被忽略的是路径层级和斜杠方向——写错一个字符,getResourceAsStream 就静默返回 null,连异常都不抛。










