Maven 资源配置详解
一、配置说明
在 Maven 中,资源文件(如配置文件、属性文件等)通过 <resources>
配置管理,主要控制:
- 资源目录位置
- 文件过滤(变量替换)
- 包含/排除规则
- 多模块优先级
二、基础配置样例
<build>
<resources>
<!-- 主资源目录配置 -->
<resource>
<directory>src/main/resources</directory> <!-- 资源路径 -->
<filtering>true</filtering> <!-- 启用变量替换 -->
<includes> <!-- 包含规则 -->
<include>**/*.properties</include>
<include>config/*.xml</include>
</includes>
<excludes> <!-- 排除规则 -->
<exclude>**/test.*</exclude>
</excludes>
</resource>
<!-- 添加额外资源目录 -->
<resource>
<directory>src/main/config</directory>
<filtering>false</filtering>
</resource>
</resources>
<!-- 测试资源独立配置 -->
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
三、多项目配置规则与优先级
1. 父子模块配置原则
配置位置 | 生效范围 | 优先级 |
---|---|---|
父 POM | 所有子模块(默认继承) | 低 |
子模块 POM | 仅当前模块 | 高 |
子模块显式配置 | 覆盖父 POM 配置 | 最高 |
2. 覆盖规则示例
父 POM:
<resources>
<resource>
<directory>parent-resources</directory>
</resource>
</resources>
子模块 POM (覆盖父配置):
<resources>
<!-- 父配置被完全覆盖,仅当前配置生效 -->
<resource>
<directory>child-resources</directory>
</resource>
</resources>
子模块合并配置 (显式包含父资源):
<resources>
<!-- 手动包含父资源目录 -->
<resource>
<directory>../parent-resources</directory>
</resource>
<!-- 子模块自有资源 -->
<resource>
<directory>child-resources</directory>
</resource>
</resources>
四、生效规则详解
1. 目录生效顺序
- 文件覆盖:同名文件按配置顺序,后处理的覆盖先处理的
- 目录独立:不同目录的文件会合并到输出目录
2. 过滤规则(filtering)
- 开启过滤 (
<filtering>true</filtering>
):- 替换资源文件中的
${property}
占位符 - 属性来源:
pom.xml
属性、settings.xml
、系统属性、外部属性文件
- 替换资源文件中的
- 过滤作用域:仅对当前
<resource>
生效
3. 包含/排除规则
- 规则使用 Ant 风格路径匹配
- 执行顺序:
- 应用
includes
→ 2. 应用excludes
- 应用
- 默认行为:
- 未配置
<includes>
:包含目录所有文件 - 未配置
<excludes>
:不排除任何文件
- 未配置
4. 多模块优先级总结
- 子模块 POM 配置 > 父 POM 配置
- 同模块内按
<resource>
顺序处理 - 依赖传递的资源 不会自动合并(需用 Assembly 插件)
五、最佳实践
统一父 POM 配置
公共资源在父 POM 定义,子模块按需覆盖<!-- 父 POM 定义模板 --> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <includes><include>**/*.tpl</include></includes> </resource> </resources>
敏感信息过滤
结合 Maven Profiles 动态切换环境配置:<profile> <id>prod</id> <build> <resources> <resource> <directory>src/main/resources-prod</directory> <filtering>true</filtering> </resource> </resources> </build> </profile>
冲突解决
同名文件按资源目录声明顺序覆盖:<!-- 优先使用 env 目录文件 --> <resource> <directory>src/main/resources-env</directory> </resource> <resource> <directory>src/main/resources</directory> </resource>
⚠️ 注意:默认资源目录
src/main/resources
一旦自定义配置,需显式声明才能生效!
六、配置样例
pom.xml 中配置
<!-- 配置 resource 后,会覆盖默认配置,必须显示配置 -->
<resource>
<!-- includes 不设置,默认目录下所有文件, 默认 filtering 为 false -->
<directory>src/main/resources</directory> <!-- 你的源目录 -->
<!--<includes>
<!–<include>**/*.properties</include> <!– 包含的文件类型 –>
<include>**/*.xml</include>–>
<include>**/*.*</include>
</includes>-->
<!--<targetPath>${project.build.directory}/classes</targetPath>--> <!-- 默认目录 -->
<!--<filtering>false</filtering> 默认-->
<!--<excludes>
<exclude>env/**/*.*</exclude>
</excludes>-->
</resource>
<!-- 拷贝脚本文件 -->
<resource>
<directory>scripts</directory>
<includes>
<include>*.sh</include>
</includes>
<targetPath>${project.build.directory}/scripts</targetPath>
</resource>
<resource>
<!-- 需要覆盖同名文件,需要 filtering 设置为 true, 默认 targetPath 为
${project.build.outputDirectory} 即 target/classes 下-->
<directory>src/main/resources/env</directory>
<filtering>true</filtering>
</resource>
</resources>