maven-resources-plugin详解

news2024/11/17 17:25:48

目录

    • 一、什么场景会用到?
    • 二、他有什么作用?
    • 三、插件常用配置
      • 1、字符集编码
      • 2、resources相关的配置
        • 2.1、resources配置结构
        • 2.2、resources默认配置
          • 2.2.1、maven超级pom默认配置
          • 2.2.2、spring-boot对resources插件的默认配置
          • 2.2.3、resources最终生效的配置
        • 2.3、resources下的标签详解
          • 2.3.1、filtering的使用
          • 2.3.2、为什么非得使用includes指定文件?
          • 2.3.3、include和excludes的使用
        • 2.4、什么场景需要配置resources?
      • 3、maven-resources-plugin配置

本篇文章重点针对这几个问题进行讲解:

  • maven-resources-plugin到低在什么场景下使用?
  • 他到底有什么作用?
  • 他和pom当中配置的resources标签又有什么关联?
  • 为什么有的项目使用了该插件而有的却没有?
  • resources当中的filtering标签到低是干什么的?
  • maven怎么打包过滤文件?

一、什么场景会用到?

这个插件只要我们编译代码就会用到该插件,就算我们项目没有声明该插件也照样会使用到,怎么证明呢?

我们可以在一个新的maven项目,不添加任何依赖,然后使用mvn clean install

Maven 默认为一些核心的生命周期阶段绑定了插件目标,当用户调用这些阶段时,对应的插件目标就会自动执行相应的任务。其中maven-resources-plugin的resources和testResources两个目标,绑定到了default生命周期的process-resources和process-test-resources两个阶段上。

关于生命周期不是很理解的可以看一下这篇文章,本篇不过多介绍:https://blog.csdn.net/weixin_43888891/article/details/130756192

二、他有什么作用?

作用:他的作用是将项目的资源(resources目录下)目录的文件复制到输出目录(target),输出目录又分为了两个,一个是测试的输出目录,一个是主资源的。所以对应了process-resources和process-test-resources两个阶段上,当然一般测试目录并没有资源目录。

什么是资源文件?

.java文件在运行的时候需要通过JRE编译成.class文件,然后放到target目录,然后本地启动项目的时候,jvm运行target目录下的编译过后的.class代码文件,

而资源文件就是不属于.java文件,那也就意味着不需要参与编译工作,但是运行的时候又依赖与他。这时候就需要通过maven-resources-plugin插件将其放到编译后的路径。这样我们项目启动的时候资源文件才能被使用。这也就是我们有时候项目经常会出现明明代码当中有这个文件,但是运行却说找不到文件的原因。

假如对生命周期了解的,看下图应该很容易就明白插件的作用了:

官网介绍:https://maven.apache.org/plugins/maven-resources-plugin/

三、插件常用配置

1、字符集编码

在这里插入图片描述

既然插件是copy资源文件那必然涉及到文件的编码,可以选择的编码有ASCII, UTF-8 或者 UTF-16,设置编码的方式有两种

第一种:使用properties标签声明project.build.sourceEncoding,声明好后,插件当中的<encoding>标签会取这个编码

<project ...>
 ...
 <properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   ...
 </properties>
 ..
</project>

第二种通过插件配置:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.3.1</version>
        <configuration>
          ...
          <encoding>UTF-8</encoding>
          ...
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

注意:只要官网当中提到了可以使用${…}的方式配置,那么我们就可以不声明插件,可以直接在properties当中配置。

2、resources相关的配置

2.1、resources配置结构

resources标签其实就是maven-resources-plugin的配置,主要用来配置资源目录的

<build>
	<resources>
	  <resource>
	 		<directory>${project.basedir}/src/main/resources</directory>
	 		<filtering></filtering>
		  <includes>
	  			<include></include>
	 		</includes>
	  	<excludes>
	   			<exclude></exclude>
	  	</excludes>
	 </resource>
	  <!--假如资源目录有多个可以在这里声明-->
	  <resource>
	    ...
	  </resource>
	  
	</resources>
</build>
  • 标签<directory>指定资源文件目录
  • 标签 <includes>指定资源文件目录中,仅包含哪些文件被打包
  • 标签<excludes>指定资源文件目录中,仅哪些文件不被打包
  • 标签<filtering>是一个bool值,默认值为false。指定打包时的配置文件中是否进行变量替换

2.2、resources默认配置

所谓默认配置就是在项目当中不设置resources标签,他默认生效的

2.2.1、maven超级pom默认配置

maven项目默认继承了一个父pom.xml,配置主要包含了如下,其中一些配置就是对maven-resources-plugin插件的配置:

关于如何查看默认继承的pom配置,感兴趣的可以看这一篇文章:https://blog.csdn.net/weixin_43888891/article/details/130483451

  <build>
    <directory>${project.basedir}/target</directory>
    <!-- 主资源默认输出的位置 -->
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <!--打出来的默认jar、war包名-->
    <finalName>${project.artifactId}-${project.version}</finalName>
    <!-- 测试资源默认输出的位置 -->
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <!--默认的主源代码地址-->
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <!--默认的测试源代码地址-->
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <!--默认的主源代码当中的资源文件地址-->
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <!--默认的测试源代码当中的资源文件地址-->
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
  </build>

比如outputDirectory就是maven-resources-plugin插件当中的配置如下:

2.2.2、spring-boot对resources插件的默认配置

springboot项目一般我们都会继承一个spring-boot-starter-parent,而他的pom当中就默认给我们做了一些resources插件的配置:

像这些resources标签的都是resources插件的配置,关于这个配置起到了什么作用后面会讲!

除此之外pluginManagement当中还存在resources插件的配置,如下:

2.2.3、resources最终生效的配置

假如我们项目没有继承spring-boot-starter-parent那么我们的项目默认继承了一个父pom,resources默认配置如下:

<resources>
  <resource>
    <directory>${project.basedir}/src/main/resources</directory>
  </resource>
</resources>

假如继承了spring-boot-starter-parent,那么我们的的项目resources默认配置如下,他会将maven默认配置给替换掉:

<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*.yaml</exclude>
      <exclude>**/application*.properties</exclude>
    </excludes>
  </resource>
</resources>

这里需要注意一点:假如我们项目当中去声明resources标签,那么他会将继承的父类当中的resources标签给替换掉,说白了就是重写的会覆盖继承的

2.3、resources下的标签详解

2.3.1、filtering的使用

关于这个标签官网也有叙述:https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

filtering默认为false,作用是是否允许指定任意文件可以以${...} or @...@的语法来提取pom.xml当中的配置。

用法示例:

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

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

3.如果需要对配置文件中变量进行替换实际值,就需要开启<filtering>,该值设置为true。这里使用了includes标签指定了文件,也就是允许application.properties文件读取变量值。

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

4.执行mvn clean package -DskipTests 打包,然后打开target/classes目录当中查看资源文件,会发现使用 @...@取值成功了,而${...} 没有成功。

这个替换值是maven-resources-plugin插件的功能,其实我们不需要打包也可以测试,直接通过调用改插件的目标即可:mvn resources:resources

原因:这是因为我这个项目继承了spring-boot-starter-parent,而springboot的xml当中有一个这个标签<resource.delimiter>将取值语法改为了 @...@,因为spring害怕和其他语法有冲突,所以使用了这个配置。

我们也可以通过手动声明来覆盖springboot父类的配置,这样便可以通过${...}语法进行取值了。

<properties>
	<resource.delimiter>${*}</resource.delimiter>
</properties>

5.通过命令进行指定变量的值:mvn clean package -DskipTests -Dusername="lisi"

注:命令的优先级要高于pom当中配置的变量值

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

<build>
	<filters>
		<filter>src\main\resources\filters_file.properties</filter>
	</filters>
	<resources>
		<resource>
			<directory>src/main/resources</directory>
			<filtering>true</filtering>
            <includes>
                <include>application.properties</include>
            </includes>
        </resource>
	</resources>
</build>
2.3.2、为什么非得使用includes指定文件?

没有必要使用变量取值的,千万不要将filtering设置为true,针对于这一点官网也明确指出二进制文件一定不要过滤,之前我遇到过一个bug就是resources文件夹当中存放有Excel模板,导出模板后发现是乱码的,但是通过源代码打开Excel就是正常的,原因就是将文件给进行过滤了。导致编译过后target当中的Excel都是乱码的。

在这里插入图片描述

2.3.3、include和excludes的使用

关于这个标签官网也有叙述:https://maven.apache.org/plugins/maven-resources-plugin/examples/include-exclude.html

我们来看springboot默认的配置,针对于上面一个环节我们已经搞清楚了,但是下面的呢,为什么允许了,后面又使用exclude给过滤掉了呢?

其实实际开发当中很多人对这都是不理解,配置起来也是一顿乱配置。多读两遍我图片上写的注释,一旦理解了,就彻底懂了!

include和excludes标签也可以同时出现在一个resource当中,例如如下:
将以txt结尾的文件copy到target,需要排除掉文件名当中携带test的。

**/代表的是根目录,/src/main/resources 和 /src/main/java 这两个都属于根目录,一个*可以代表一个占位符,可以是多个字母组成的

<build>
  ...
  <resources>
    <resource>
      <directory>src/my-resources</directory>
      <includes>
        <include>**/*.txt</include>
      </includes>
      <excludes>
        <exclude>**/*test*.*</exclude>
      </excludes>
    </resource>
    ...
  </resources>
  ...
</build>

2.4、什么场景需要配置resources?

  1. 假如src/main/java下存在非.java文件,但是也需要参与打包,这时候需要手动配置resources,因为不管是maven默认继承的父pom还是springboot的父pom,都只会将resources下的资源文件参与打包。
  2. 如果项目继承了spring-boot-starter-parent,然后需要使用application.properties变量取值,是可以不配置的,因为springboot默认配置了,假如我们还有很多配置文件,例如application-dev.properties、application-prod.properties这些都需要使用变量取值,这时候就需要覆盖掉springboot的resources配置来手动配置。
  3. 有的项目会习惯性将每个版本的升级sql存放到resources文件夹下,假如我们不做任何配置的情况下,他也会参与打包。假如sql文件比较大,那打出来的jar包也一定很大。
  4. 默认的资源目录就是src/main/resources,假如项目有资源目录以外的文件需要参与打包这时候就需要手动指定。

关于resources标签当时我还专门写了一篇关于这个的文章,当时其实是似懂非懂,只能说通过亲自试验得出来了一些结论:https://blog.csdn.net/weixin_43888891/article/details/122406081

两篇文章结合着看基本上就可以彻底掌握了!

3、maven-resources-plugin配置

官网相关配置详解:https://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html

maven-resources-plugin插件是maven内置插件,我们就算项目不声明,调用的时候也会访问。一般项目当中本身也就不需要声明,基本上都是通过resources标签来控制资源文件的。

springboot父pom默认配置如下:

  • delimiter:就是更改变量取值的形式,上面也有提到过。
  • propertiesEncoding:就是字符编码

这是我当时在公司遇到的一个关于该插件的bug:https://blog.csdn.net/weixin_43888891/article/details/130089503

在彻底掌握了resources之后才发现原来公司很多开发都是一顿乱配置,包括我在内,哈哈哈

当时就是使用了filtering为true然后导致Excel压缩过后打不开了,然后添加了如下配置

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<version>3.2.0</version>
	<configuration>
	  <nonFilteredFileExtensions>
		 <!--不应用过滤的其他文件扩展名(已定义的有:jpg, jpeg, gif, bmp, png)-->
		  <nonFilteredFileExtension>xls</nonFilteredFileExtension>
		  <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
	   </nonFilteredFileExtensions>
	</configuration>
</plugin>

这里有一点需要注意,springboot在父pom的pluginManagement设置了maven-resources-plugin,而我们又在项目当中声明了maven-resources-plugin,最终他生效的是父pom+我们声明的配置:

通过mvn help:effective-pom命令即可查看生效的pom

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年最新VMware 17+虚拟机详细配置安装【程序员使用指南】!!

文章目录 Vmware版本选择17Pro安装自定义安装填写对应的许可证正式安装虚拟机进行对应的配置配置镜像文件选择对应的语言&#xff1a;到这个界面&#xff0c;选择中文 安装结束连接对应的xshell Vmware版本选择17Pro安装 ● 最开始从这里出发 自定义安装 ● 记得自定义在自…

TikTok选品,什么产品在TikTok最受欢迎?

TikTok是当下的海外社交媒体推广新风口已经有目共睹&#xff0c;与此同时跨境商家们或许都面临着同样的问题&#xff0c;就是TikTok要怎么选品&#xff0c;什么产品才会比较受欢迎。俗话说&#xff1a;七分靠选品&#xff0c;三分靠运营。选品选对了&#xff0c;运营也就事半功…

chatgpt赋能Python-python3_decode函数

Python3 decode函数 - 解码你的数据 编程领域中&#xff0c;字符串是一个不可避免的概念&#xff0c;他们构成了我们生活中逻辑化和技术实现化的重要组成部分。不仅如此&#xff0c;字符串的加载和使用也对程序的性能产生了重大的影响。在这篇文章中&#xff0c;我们将重点讨论…

现在有什么基于vue3.0的优秀开源项目呢?

前言 以下是一些github上一些基于vue3.0的优秀开源项目&#xff0c;可以自己选择一些去练一下手&#xff0c;废话少说&#xff0c;直接进入正题---- 1、 vue-manage-system Star: 16k 是一个基于 Vue3 和 Element Plus 的后台管理系统解决方案&#xff0c;它提供了一系列的通…

电脑找不到msvcr110.dll怎么办?电脑msvcr110.dll丢失怎么解决?

在使用某些软件或游戏时&#xff0c;有时会出现找不到msvcr110.dll文件的错误提示&#xff0c;这会导致程序无法正常运行。这个问题通常是由于缺少Visual C msvcr110.dll引起的。下面是解决这个问题的几个方法&#xff1a; msvcr110.dll的解决方法一 直接使用dll修复程序进行修…

videojs扩展方法,自定义功能

8版本不支持extend&#xff0c;8支持es6扩展 videojsextend

DeepGPS: Deep Learning Enhanced GPS Positioning in Urban Canyons

DeepGPS: Deep Learning Enhanced GPS Positioning in Urban Canyons IEEE TMC&#xff5c;深度学习增强的城市峡谷GPS定位 https://github.com/bducgroup/DeepGPS 文章目录 DeepGPS: Deep Learning Enhanced GPS Positioning in Urban CanyonsAbstract1 INTRODUCTION2 BACKGRO…

【C++】如何克服红黑树的恐惧?看这篇文章足够了

红黑树的实现会比AVL简单-.- 文章目录 判断是否是AVL树一、红黑树二、红黑树的实现总结 判断是否是AVL树 上一篇文章我们详细介绍了AVL树并且实现了AVL树&#xff0c;这篇文章我们将在前言中引入判断是否是AVL树的方法&#xff0c;然后我们就进入红黑树的实现&#xff0c;如果…

从0到1精通性能测试,需求到实战压力测试实例(详情)你要的都有...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试需求分析…

David Silver Lecture 9:Exploration and Exploitation

1 Introduction 1.1 Outline 1.1.1 Exploration vs. Exploitation Dilemma 1.1.2 examples 1.1.3 principles Naive Exploration 在前面的章节主要使用的是naive exploration的方法Optimistic Initialisation 这种方法的思想是&#xff0c;我们对每个动作的奖励给出一个乐观的…

C语言深度解刨(一)——关键字

文章目录 前言关键字定义和声明&#xff0c;你懂了吗&#xff1f;最宽宏大量关键字——auto最快的关键字——register最名不副实的关键字——static修饰变量修饰函数 基本数据类型——short、int、long、char、flaot、double变量命名规则 最冤枉的关键字——sizeof常年被人误认…

Java开发 - 不知道算不算详细的分布式锁详解

前言 今天给大家带来一篇关于分布式锁的好文&#xff0c;关于分布式系统下的内容&#xff0c;博主已经写了好几篇了&#xff0c;也收获了大家的不少好评。分布式系统在目前的开发中所占的比重还是比较大的&#xff0c;如果你还没接触过分布式系统&#xff0c;那么欢迎你去学习…

操作文件 --Java EE

目录 一、文件的概念 二、文件的目录&#xff08;directory&#xff09; 三、文件路径&#xff08;Path&#xff09; 四、文件的分类 五、文件的操作 1.文件系统的操作 1.1创建文件--createNewFile( ) 1.2删除文件--delete( ) 和 deleteOnExit( ) 1.3文件改名--renam…

2023ICPC西安邀请赛

比赛完由于被旅游、赶ddl、上班等等各种事情影响&#xff0c;导致我现在才有时间可以写写小作文&#xff0c;这中间隔得时间有点长了&#xff0c;已经不知道从哪开始说起了&#xff0c;灵感也都流失了… before Friday 比赛前一个周&#xff0c;我的队友djk&#xff0c;也是我…

HNU-计算机系统-Challenge

Challenge 计科210X wolf 202108010XXX 本题是从属于第七次讨论课的个人题,听说做了有加分?我来试试。 下面是相关报告。 题目: C 语言的初学者第一个编写的 C 代码一般是如下所示的“ #include <stdio.h> int main() {printf("Hello, World!");

003 - STM32固件库GPIO(三)位带操作

目前掌握的对GPIO引脚的输入输出操作只能使用BSRRL/H、I/ODR寄存器&#xff0c;记得以前学51的时候&#xff0c;对于引脚的输入输出可以采用关键字sbit实现位定义,例如 sbit LED1 P1^3;在STM32中没有类似于sbit一样的关键字&#xff0c;但是提供了位带操作来实现类似于51的为…

网络协议与攻击模拟-11-DHCP协议原理

DHCP 协议 1、掌握 DHCP 的工作原理 2、会在 Windows server 上去部署 DHCP 服务 3、抓流量 &#xff0e;正常 收到攻击后 一、 DHCP 1、 DHCP 基本概念 dhcp &#xff08;动态主机配置协议&#xff09;&#xff1a;主要就是给客户机提供 TCP / IP 参数&#xff08; IP 地…

微信小程序nodejs+vue社区居民健康服务系统uniapp

系统分为社区居民&#xff0c;管理员&#xff0c;县区工作员&#xff0c;社区工作员三个角色 县区工作员的主要功能&#xff1a; 1.对社区的工作人员进行添加&#xff0c;修改&#xff0c;删除&#xff0c;查询 2.疫情专栏的信息进行添加&#xff0c;修改&#xff0c;删除&…

特瑞仕 :8种PCB接地方案+14种PCB接地技巧

​在PCB设计中&#xff0c;接地是非常重要的一环&#xff0c;它涉及到整个电路的性能、可靠性和EMI等问题。在实际设计中&#xff0c;有多种接地方案和技巧可供选择&#xff0c;如何选择合适的接地方案和技巧对于设计的成功至关重要。本文将详细介绍8种常见的PCB接地方案和14种…

【软考】系统集成项目管理工程师 第1章 信息化知识

文章目录 1.1 信息与信息化1.1.1 信息1.1.2 信息系统1.1.3 信息化1.1.4 国家信息化体系要素1.1.5 信息技术发展趋势 1.3 电子政务1.3.1电子政务的概念和内容1.3.2我国电子政务开展的现状1.3.3电子政务建设的指导思想和发展方针1.3.4电子政务建设的发展方向和应用重点 1.4 企业信…