目录
  • 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

    到此这篇关于maven中resource配置详解的文章就介绍到这了,更多相关maven resource配置内容请搜索本网站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本网站!

    您可能感兴趣的文章:

    • maven工程如何读取resource目录下配置文件
    • Maven项目中resources配置总结
    • Maven项目中读取src/main/resources目录下的配置文件的方法
    • maven中resource配置的实现示例