filtering标签和includes,excludes标签都是resource标签下的标签,它们经常出入成双。然而这两者根本就是截然不同的。

filtering用于扩大范围,什么范围呢?maven默认只会替换pom文件中的占位符属性,不会触碰resources下相关文件的.但filtering=true了,就可以触碰了,触碰的效果就是能替换resources下指定文件的占位符属性.

默认情况下,maven打包时会包含resources下所有的文件.如果我们只想让指定的几个文件被打包,那就将这几个文件放在includes标签下处理;同理: 如果我们不想让这几个文件被打包,那就将这几个文件放在excludes标签下处理.

filtering的单独使用
  1. 没有使用filtering时:

pom文件中定义在不同激活区的属性xxx

<profiles><profile><id>dev</id><properties><xxx>dev</xxx></properties></profile><profile><id>sit</id><properties><xxx>sit</xxx></properties></profile><profile><id>uat</id><properties><xxx>uat</xxx></properties></profile>
</profiles>

bootstrap.properties文件中定义的占位符属性${xxx}

spring.cloud.config.profile=${xxx}

使用-Psit打包后target下对应文件原封不动,没被替换:

spring.cloud.config.profile=${xxx}
  1. 使用filtering后:
<build><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>

使用-Psit打包后target下对应文件中${}占位符被替换了:

spring.cloud.config.profile=sit

3.注意点:

  • 若单纯是maven项目,则可以使用${}占位符;
  • 若是springboot项目,则占位符需使用@xxx@,使用${}将失效.spring-boot-starter-parent为了防止与pom的占位符冲突,通过maven-resources-plugin将maven使用的资源占位符专门设置为:@ ,如下:
<properties><java.version>1.6</java.version><resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.target>${java.version}</maven.compiler.target>
</properties><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><delimiters><delimiter>${resource.delimiter}</delimiter></delimiters><useDefaultDelimiters>false</useDefaultDelimiters></configuration>
</plugin>

可通过自己配置plugin覆盖此处配置:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.1.0</version><configuration><encoding>utf-8</encoding><!-- 使Spring Boot支持${}占位符 --><useDefaultDelimiters>true</useDefaultDelimiters></configuration></plugin></plugins>
</build>
includes与excludes的使用

resources下文件有多个:

  • 如果使用了include
<build><resources><resource><directory>${project.basedir}/src/main/resources</directory><includes><include>dev/</include></includes></resource></resources>
</build>

则打包时进入target的是这样的:

  • 如果使用了exclude
<build><resources><resource><directory>${project.basedir}/src/main/resources</directory><excludes><exclude>dev/</exclude></excludes></resource></resources>
</build>

则打包时进入target的是这样的:

  • 如果同时使用了include和exclude,
<build><resources><resource><directory>${project.basedir}/src/main/resources</directory><includes><include>dev/</include></includes><excludes><exclude>dev/application-dev.*</exclude></excludes></resource></resources>
</build>

则打包时是这样的:

一个排除,一个包含,可以各自单独使用,也可以混合使用,混合使用时,如果范围有交集,会被排除掉,通常用于过滤掉文件夹中的几个特殊文件

filtering与include,exclude混合使用

有三大作用:

  1. 排除资源-------使用excludes排除

  2. 包括资源, 替换属性-------使用include包含, 且使用filtering=true过滤

  3. 包括资源, 不替换属性-------使用include包含,且不使用filtering过滤

如果这样用:

<build><resources><resource><directory>${project.basedir}/src/main/resources</directory>//资源过滤: 只保留dev文件夹下名字不是application-dev的文件<includes><include>dev/</include></includes><excludes><exclude>dev/application-dev.*</exclude></excludes>//扩大属性替换范围: 替换资源过滤最终留下来的文件中的@xxx@占位符属性<filtering>true</filtering></resource></resources>
</build>

那么打包结果:

target文件夹下的application-dev2.properties文件的属性值变化:

spring.cloud.config.profile=${xxx}    ----->      spring.cloud.config.profile=sit

总结:

  1. filtering用于打包时扩大maven替换占位符属性的范围, true表示会替换所在resource标签确定的文件范围内的占位符属性

  2. include和exclude用于打包时资源过滤, 主要目的是把resources下不想要的文件排除掉,不打进包中.

  3. 它俩都是resource标签下的子标签, 一个用于过滤资源,一个用于是否替换占位符属性, 一般都是搭配使用, 但两者功能迥异.

扩展:

在springboot项目中,spring-boot-starter-parent存在以下代码:

<resources><resource><directory>${basedir}/src/main/resources</directory><filtering>true</filtering><includes><include>**/application*.yml</include><include>**/application*.yaml</include><include>**/application*.properties</include></includes></resource><resource><directory>${basedir}/src/main/resources</directory><excludes><exclude>**/application*.yml</exclude><exclude>**/application*.yml</exclude><exclude>**/application*.properties</exclude></excludes></resource></resources>

其中第一段<resource>配置声明:在src/main/resources目录下,仅**/application*.yml、**/application*.yml、**/application*.properties文件是资源文件,参与打包过程;并且这些文件可以被替换占位符属性。
      第二段<resource>配置声明:同样在src/main/resources目录下,除**/application*.yml、**/application*.yml、**/application*.properties文件外的其他文件是资源文件,参与打包过程;并且这些文件不能被替换占位符属性。

注意:

  • 一个<resource>代表一个资源配置。不同的<resource>并无关系。前面提到的<include>和<exclude>在同一个<resource>中,即对同一个资源进行资源管理;而在spring-boot-starter-parent中,<include>和<exclude>在不同的<resource>,分别对各自<resource>进行管理。
  • 若在自己的pom中配置如下:
<resources><resource><directory>${basedir}/src/main/resources</directory><filtering>true</filtering><includes><include>**/application*.yml</include></includes></resource><resource><directory>${basedir}/src/main/resources</directory><excludes><exclude>**/application*.yml</exclude></excludes></resource></resources>

将会覆盖spring-boot-starter-parent中的代码,即spring-boot-starter-parent中的代码将失效。

springboot中maven文件pom.xml的<resource>下的<includes>和<excludes>相关推荐

  1. pom文件找不到子项目_java,eclipse_eclipse中maven项目pom.xml文件找不到parent要怎么解决?,java,eclipse,maven - phpStudy...

    eclipse中maven项目pom.xml文件找不到parent要怎么解决? 在maven项目中方pom.xml文件找不到parent,maven clean报错如下: [ERROR] [ERROR ...

  2. maven的pom.xml文件中导入c3p0连接池,在运行时报错

    maven的pom.xml文件中导入c3p0连接池运行时报错 错误内容如下: java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/imp ...

  3. 在maven的pom.xml文件中导入tomcat插件后启动tomcat7报错

    在maven启用tomcat有两种方式,一种是集成本地的tomcat,另一种是在pom.xml文件中插入tomcat插件,本人小白初学第一种方式运行成功后,开始实验第二种方式,运行后出现报错 原因是端 ...

  4. Java 中JAF、CORBA、JTA、JAXB、JAX-WS使用Maven的pom.xml文件配置

    本文主要介绍Java EE中已经弃用的模块,需要单独引用JAF(java.activation).CORBA(java.corba).JTA(java.transaction).JAXB(java.x ...

  5. Linux中把文件夹打成war包,SpringBoot中maven项目打成war包部署在liunx服务器上的方法...

    说明:Spring Boot由于内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再像Spring项目还需要外置的Tomcat等容器来进行部署工作了,通过启动 ...

  6. Maven的pom.xml文件详解------The Basics

    转载自  Maven的pom.xml文件详解------The Basics Maven坐标 GroupId.artifactId和version构成了Maven的坐标(groupId和version ...

  7. Maven的pom.xml文件详解------Build Settings

    转载自  Maven的pom.xml文件详解------Build Settings 根据POM 4.0.0 XSD,build元素概念性的划分为两个部分:BaseBuild(包含poject bui ...

  8. Maven的pom.xml文件详解------Environment Settings

    转载自  Maven的pom.xml文件详解------Environment Settings Issue Management 使用的缺陷跟踪系统(Bugzilla,TestTrack,Clear ...

  9. maven项目pom.xml中parent标签的使用

    本文来说下maven项目pom.xml中parent标签的使用 文章目录 parent标签 parent标签由来 依赖排除 本文小结 parent标签 parent标签使用例子 <!--父项目的 ...

最新文章

  1. js判断只能输入数字或小数点
  2. 转:函数要多小才够好——谈小函数之道
  3. php正则获取标签,PHP通过正则匹配中文字符 过滤html标签 获取文本内容
  4. elk入门_ELK堆栈入门
  5. JS之setTimeOut与clearTimeOut
  6. vscode创建代码片段
  7. Python 学习笔记:class
  8. (环境搭建+复现)ZZZCMS模版注入+文件包含getshell
  9. bccomp php扩展,PHP 中文工具包 ChineseUtil v2.0 发布,引入 FFI 提升性能节省内存
  10. 因为毕业半年挣了100万,帅地在CSDN被喷上热榜
  11. CAN总线网络知识(一)
  12. 仅需三步学会使用低代码ThingJS与森数据DIX数据对接
  13. 【游戏开发创新】当我学了Blender 建模,自制3D电脑桌面,回收站爆发了,把我做的模型都吐了出来(Blender | Unity | FBX)
  14. 微波背景辐射的发现(获诺贝尔奖)——彭齐亚斯和威尔逊
  15. 小酌重构系列[18]——重命名
  16. 在你生日那天,哈勃望远镜看到了什么
  17. 能链科技子公司上海能链获颁高新技术企业资质
  18. python制作三维码_2020你没有三维码就out了,5秒教你学会制作三维码
  19. 【历史上的今天】10 月 18 日:Internet Explorer 7 正式发布;全球首家网络银行开业;“美版红白机” NES 诞生
  20. 周大福家源信物 | 连心携梦,点亮璀璨星愿

热门文章

  1. 无刷直流电机--参考博客
  2. QT版本为4.7.3的移植(简化版)
  3. 电脑监控软件使用上网行为管理的正确姿势
  4. 千禧年大奖难题之始与未终
  5. 如何实现一个最大的正方形
  6. 论文解读《SOLO: Segmenting Objects by Locations》
  7. 单机版安装,伪分布式安装
  8. 掌纹识别技术解决安全问题 让密码成为历史
  9. 301,404,网站地图
  10. 电信光猫设置手机wifi