Maven resources资源配置详解

发布于:2025-08-19 ⋅ 阅读:(12) ⋅ 点赞:(0)

Maven 资源配置详解

一、配置说明

在 Maven 中,资源文件(如配置文件、属性文件等)通过 <resources> 配置管理,主要控制:

  1. 资源目录位置
  2. 文件过滤(变量替换)
  3. 包含/排除规则
  4. 多模块优先级

二、基础配置样例
<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. 目录生效顺序
配置的第一个 resource
第二个 resource
...
  • 文件覆盖:同名文件按配置顺序,后处理的覆盖先处理的
  • 目录独立:不同目录的文件会合并到输出目录
2. 过滤规则(filtering)
  • 开启过滤 (<filtering>true</filtering>):
    • 替换资源文件中的 ${property} 占位符
    • 属性来源:pom.xml 属性、settings.xml、系统属性、外部属性文件
  • 过滤作用域:仅对当前 <resource> 生效
3. 包含/排除规则
  • 规则使用 Ant 风格路径匹配
  • 执行顺序
    1. 应用 includes → 2. 应用 excludes
  • 默认行为
    • 未配置 <includes>:包含目录所有文件
    • 未配置 <excludes>:不排除任何文件
4. 多模块优先级总结
  1. 子模块 POM 配置 > 父 POM 配置
  2. 同模块内按 <resource> 顺序处理
  3. 依赖传递的资源 不会自动合并(需用 Assembly 插件)

五、最佳实践
  1. 统一父 POM 配置
    公共资源在父 POM 定义,子模块按需覆盖

    <!-- 父 POM 定义模板 -->
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <includes><include>**/*.tpl</include></includes>
      </resource>
    </resources>
    
  2. 敏感信息过滤
    结合 Maven Profiles 动态切换环境配置:

    <profile>
      <id>prod</id>
      <build>
        <resources>
          <resource>
            <directory>src/main/resources-prod</directory>
            <filtering>true</filtering>
          </resource>
        </resources>
      </build>
    </profile>
    
  3. 冲突解决
    同名文件按资源目录声明顺序覆盖:

    <!-- 优先使用 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>
                    &lt;!&ndash;<include>**/*.properties</include> &lt;!&ndash; 包含的文件类型 &ndash;&gt;
                    <include>**/*.xml</include>&ndash;&gt;
                    <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>

网站公告

今日签到

点亮在社区的每一天
去签到