目录
  • maven中resource标签详解
    • 1. 使用场景
    • 2. 使用语法
      • 2.1 resource配置结构
      • 2.2 配置语法及特殊场景
    • 3. 示例项目的结构

    maven中resource标签详解

    1. 使用场景

    通常情况下, maven项目中默认资源文件为src/main/resourcessrc/test/resources目录

    但项目中可能会有以下场景:

    • 需要添加src/main/resources之外的目录中的配置文件
    • 只需要src/main/resources中部分配置文件
    • 需要对src/main/resources中配置文件的变量, 进行placeholder进行解析值替换

    这时候, 就需要在pom中配置build.resouces.resouce进行个性化配置

    2. 使用语法

    2.1 resource配置结构

    在pom中配置中可以配置的元素结构如下:

    <build>
    <resources>
      <resource>
     		<directory></directory>
     		<filtering></filtering>
    	  <includes>
      			<include></include>
     		</includes>
      	<excludes>
       			<exclude></exclude>
      	</excludes>
     </resource>
      <resource>
        ...
      </resource>
    </resources>
    </build>
    • 标签<directory>指定资源文件目录
    • 标签 <includes>指定资源文件目录中,仅包含哪些文件被打包
    • 标签<excludes>指定资源文件目录中,仅哪些文件不被打包
    • 标签<filtering>是一个bool值,默认值为false。指定打包时的配置文件中是否进行变量替换

    2.2 配置语法及特殊场景

    (示例项目的结构参考文件最后)

    2.2.1 filtering的使用

    1.资源文件中使用${keyword}占位符来定义变量, 如src/main/resouces/application.properties:

    application.user=${username}
    application.password=${password}

    2.这时候可以在pom.xml文件中定义变量的取值

    <properties>
     <username>mysql</username>
     <password>password123</password>
    </properties>

    3.如果需要对配置文件中变量进行替换实际值,就需要开启<filtering>,该值设置为true

      <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>application.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>

    打包后, 资源文件src/main/resouces/application.properties:

    application.user=mysql
    application.password=mysql

    另, 变量的定义可以不放在pom里, 也可以指定其他文件, 通过build.filters.filter配置即可. 示例:

    <build>
            <finalName>test-maven-resource</finalName>
            <filters>
                <filter>src/main/config/${active.profile}/zookeeper.properties</filter>
                <filter>src/main/config/${active.profile}/xdcs.properties</filter>
                <filter>src/main/config/${active.profile}/maven-test.properties</filter>
                <filter>src/main/config/${active.profile}/web.properties</filter>
            </filters>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src/main/config/${active.profile}</directory>
                    <filtering>false</filtering>
                </resource>
            </resources>

    2.2.2 resource之间的关系

    怎么理解pom中多个resource的关系? 并集? 交集? 还是其他?

    先说结论: 多个resource可以理解为按顺序对多个resource进行收集资源

    测试示例如下: 第一个resource排除application.properties, 第二个resource包含application.properties:

     <resources>
                <!-- 多个resource的关系: 可以理解为依次对多个resource进行收集资源 -->
                <resource>
                    <directory>src/main/resources</directory>
                    <excludes>
                        <exclude>application.properties</exclude>
                    </excludes>
                    <filtering>false</filtering>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>application.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
       </resources>

    打包后, 得到如下结构:

    target/test-resource
    ├── META-INF
    └── WEB-INF
        └── classes
            ├── application.properties
            ├── application.xml
            ├── application.yaml
            └── application.yml

    2.2.3 includes和excludes的关系

    一般情况下一个resource中单独使用其中一个即可满足要求:

    • 标签 <includes>指定资源文件目录中,仅包含哪些文件被打包
    • 标签<excludes>指定资源文件目录中,仅哪些文件不被打包

    注意, 上述描述中仅的定义. 当同时存在includesexcludes是以哪个为主?

    先说结论: 取两者描述资源的交集

    测试示例:

     <resource>
                    <directory>src/main/resources</directory>
                    <excludes>
                        <exclude>application.properties</exclude>
                    </excludes>
                    <includes>
                        <include>application.yaml</include>
                        <include>application.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>

    打包后得到结果:

    target/test-resource
    ├── META-INF
    └── WEB-INF
        └── classes
            ├── application.xml
            └── application.yaml

    2.2.4 打包默认其他目录

    打包src/main/resources默认目录之外的目录, 指定<directory>为对应目录即可

    <!-- 场景1:增加默认resource之外的目录 -->
                <resource>
                    <directory>src/main/config</directory>
                    <includes>
                        <!-- **表示任意目录,*.*表示任意文件名和扩展名-->
                        <include>**/*.*</include>
                    </includes>
                        <!-- 表示是否对配置文件中的${}占位符进行解析替换-->
                    <filtering>false</filtering>
                </resource>

    打包得到结构:

    target/test-resource
    ├── META-INF
    └── WEB-INF
        └── classes
            └── redis.properties

    从上述结果中, 可以得出一个非常重要的结论:

    如果pom中显式定义了resource, 则要想默认的src/main/resources目录生效, 必须也显式额外配置

    2.2.5 include和exclude支持通配符

    ** 表示任意目录, *.*表示任意文件名和扩展名

    <include>**/*.xml</include>
    <include>**/*.*</include>

    2.2.6 自定义filter占位符

    默认的占位符为${}, 但是为了与其他场景区分(如spring), 可能需要自定义占位符.

    只需要显式定义<resource.delimiter>的properties即可.

    <properties>
            <username>mysql</username>
            <password>admin</password>
            <resource.delimiter>@@</resource.delimiter>
     </properties>
    <build>
            <finalName>test-resource</finalName>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>application.properties</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
    </build>

    application.properties文件内容:

    application.user=@username@
    application.password=@password@

    还可以在maven-resources-plugin插件的configuration中配置:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <useDefaultDelimiters>false</useDefaultDelimiters>
            <delimiters>
              <!-- 在这里配置配一半即可,即默认开始符和结束符一样 -->
            <delimiter>@</delimiter>
            </delimiters>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>

    3. 示例项目的结构

    src
    └── main
        ├── config
        │   └── redis.properties
        ├── java
        └── resources
            ├── application.properties
            ├── application.xml
            ├── application.yaml
            └── application.yml
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。