maven中resource配置的实现示例

 更新时间:2023年09月11日 09:01:37   作者:2021不再有雨  
我们在使用Maven组件来构建项目的时候,通常将配置文件放在资源文件目录下,本文主要介绍了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配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jdbc链接远程数据库进行修改url操作

    jdbc链接远程数据库进行修改url操作

    这篇文章主要为大家详细介绍了jdbc链接远程数据库进行修改url操作,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Postman form-data、x-www-form-urlencoded的区别及说明

    Postman form-data、x-www-form-urlencoded的区别及说明

    这篇文章主要介绍了Postman form-data、x-www-form-urlencoded的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • 详解什么是Java线程池的拒绝策略?

    详解什么是Java线程池的拒绝策略?

    今天给大家总结一下线程池的拒绝策略,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • java静态工具类注入service出现NullPointerException异常处理

    java静态工具类注入service出现NullPointerException异常处理

    如果我们要在我们自己封装的Utils工具类中或者非controller普通类中使用@Autowired注解注入Service或者Mapper接口,直接注入是报错的,因Utils用了静态方法,我们无法直接用非静态接口的,遇到这问题,我们要想法解决,下面小编就简单介绍解决办法,需要的朋友可参考下
    2021-09-09
  • Java访问修饰符public、private、protected及默认访问权限详解

    Java访问修饰符public、private、protected及默认访问权限详解

    这篇文章主要介绍了Java访问修饰符public、private、protected及默认访问权限的相关资料,每种修饰符都有其特定的使用场景,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • java多线程编程之使用runnable接口创建线程

    java多线程编程之使用runnable接口创建线程

    实现Runnable接口的类必须使用Thread类的实例才能创建线程,通过Runnable接口创建线程分为以下两步
    2014-01-01
  • Mybatis实现一对一查询映射处理

    Mybatis实现一对一查询映射处理

    MyBatis是一种流行的Java持久化框架,它提供了灵活而强大的查询映射功能,本文主要介绍了Mybatis实现一对一查询映射处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 详解Spring Boot中PATCH上传文件的问题

    详解Spring Boot中PATCH上传文件的问题

    这篇文章主要介绍了详解Spring Boot中PATCH上传文件的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • mybatis 返回Integer,Double,String等类型的数据操作

    mybatis 返回Integer,Double,String等类型的数据操作

    这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java利用DFA算法实现敏感词管理

    Java利用DFA算法实现敏感词管理

    我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并不能过滤一些敏感词,所以本文就来讲讲如何通过DFA算法就行敏感词管理吧
    2024-11-11

最新评论