Maven核心插件之maven-resources-plugin

image

前言

  Maven 插件是 Maven 构建系统的重要组成部分,它们为 Maven 提供了丰富的功能和扩展能力,使得 Maven 不仅是一个构建工具,更是一个强大的项目管理平台。在 Maven 项目中,插件的使用通常通过配置 pom.xml 文件来完成。每个插件都有自己的配置参数,通过配置这些参数,可以控制插件的行为。插件为 Maven 项目提供了强大的扩展能力,使得开发者能够自定义项目的构建过程,实现自动化构建、代码生成、代码检查等多种功能。

一、插件概述

1.1 插件简介

  在项目当中进行编译的时候,默认是不会对某些文件进行编译的,例如在java文件夹下的mybatis当中的 xml 文件,还有在resources文件夹当中有时候会存储一些资源文件,默认也是不进行编译的。注意,这里的不进行编译指的是不会编译到target文件夹当中,并且打包也是。在正常开发项目的时候,有时候获取资源是获取的编译后的路径地址,在编译后的路径找不到文件(target文件夹),就是这个原因。这时候就需要用到 maven-resources-plugin 插件,在pom.xml添加,告诉maven这些文件也需要编译,并且打包的时候需要打包进去。maven-resources-plugin 是 Maven 中一个非常重要的插件,用于处理项目的资源文件。资源文件通常包括配置文件、静态文件(如 HTML、CSS、JavaScript)、图像等。这个插件提供了多种功能,如复制资源文件、过滤资源文件、设置资源文件的输出目录等。

image

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

  为了使项目结构更为清晰,Maven 区别对待Java代码文件和资源文件,maven-compiler-plugin 用来编译Java代码,maven-resources-plugin 则用来处理资源文件。默认的主资源文件目录是 src/main/resources,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置 maven-resources-plugin 来实现。

  此外,资源文件过滤也是Maven的一大特性,你可以在资源文件中使用 ${propertyName} 形式的Maven属性,然后配置 maven-resources-plugin 开启对资源文件的过滤,之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建。

  注意,这个插件只要我们编译代码就会用到该插件,就算我们项目没有声明该插件也照样会使用到,如下图所示:
image

1.2 使用方式

  在pom.xml文件中,插件配置通常位于 <build> 标签下的 <plugins> 标签内,每个插件配置由 <plugin> 标签包裹,并包含以下基本信息:

配置项简要说明
groupId插件所属的组织ID。
artifactId插件的构件ID,用于唯一标识插件。
version插件的版本号。
configuration插件的配置参数,用于控制插件的行为。

  以下是一个简单的Maven插件配置示例,展示了如何使用 Maven Resources Plugin 插件来配置为使用 Java 1.8 版本编译源代码:

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

【说明】在这个示例中,maven-resources-plugin 被配置为使用 UTF-8 编码处理资源文件。

二、插件常用配置

2.1 字符集编码

image

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

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

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

  第二种通过插件配置:

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

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

2.2 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指定资源文件目录,这里是 src/main/resources
includes指定资源文件目录中,仅包含哪些文件被打包,例如 **/*.properties 表示所有子目录下的 .properties 文件。
excludes指定资源文件目录中,仅哪些文件不被打包
filtering一个boolea值,默认值为false,指定打包时的配置文件中是否进行变量替换

2.3 resources 默认配置

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

2.3.1 maven超级pom默认配置

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

<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>

2.3.2 Spring Boot对resources插件的默认配置

  Spring Boot 项目一般我们都会继承一个 spring-boot-starter-parent,而其 pom 当中就默认给我们做了一些 resources 插件的配置,那么我们的的项目 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标签给替换掉,说白了就是重写的会覆盖继承的。

三、resources下的标签详解

3.1、filtering 的使用

  若是要将src/main/java路径下.fxml文件结尾的编译打包进去,当有两个同类型文件,只想打包进去一个文件,可以在include标签当中指定文件名称。

<build><resources><resource><directory>src/main/java</directory><filtering>true</filtering><includes><include>**/*.fxml</include></includes></resource><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>

  filtering 默认为 false,作用是是否允许指定任意文件可以以 ${...} or @...@ 的语法来提取pom.xml当中的配置。假设在 src/main/resources 目录下有一个application.properties 文件,内容如下:

userName=${userName}
userName=@userName@

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

<propweties><userName>zhangsan</userName>
</propweties>

  如果需要对配置文件中变量进行替换实际值,就需要开启 <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>

  执行mvn clean package -DskipTests 打包,然后打开target/classes目录当中查看资源文件,会发现使用 @...@取值成功了,而${...} 没有成功。这是因为项目继承了spring-boot-starter-parent,而 Spring Boot 的xml当中有一个这个标签 <resource.delimiter> 将取值语法改为了 @...@,因为spring害怕和其他语法有冲突,所以使用了这个配置。
image
  我们也可以通过手动声明来覆盖springboot父类的配置,这样便可以通过${...}语法进行取值了。

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

  这里需要特别注意的是,没有必要使用变量取值的,千万不要将filtering设置为true,针对于这一点官网也明确指出二进制文件一定不要过滤。例如在resources文件夹当中存放有Excel模板,导出模板后发现是乱码的,但是通过源代码打开Excel就是正常的,原因就是将文件给进行过滤了,导致编译过后target当中的Excel都是乱码的。解决方案就是在编译时不进行过滤,但也要被放到resource目录下。修改配置如下:
image

3.2 include和excludes的使用

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

  其实实际开发当中很多人对这都是不理解,配置起来也是一顿乱配置。来看下这个图,多看几篇,一旦理解了,就彻底懂了!
image

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

四、总结

  maven-resources-plugin 是一个功能强大且灵活的插件,用于处理项目中的资源文件。通过合理配置,可以实现资源的复制、过滤、设置输出目录等功能。了解并掌握这些配置,可以大大提高项目的灵活性和可维护性。

  Apache Maven 插件是 Maven 的核心组成部分,它们扩展了 Maven 的功能,使得 Maven 能够完成各种复杂的构建任务。了解和使用 Maven 插件对于提高项目的构建效率和质量具有重要意义,有效地利用插件来提高 Maven 项目的构建效率和质量。在实际开发中,应根据项目需求选择合适的插件,并合理配置和使用它们,增强项目的可维护性和可扩展性。
image

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[云原生之旅] K8s-Portforward的另类用法, 立省两个端口

前言 此方法适用于Pod不需要大量连接的情况: 有多个pod在执行任务, 偶尔需要连接其中一个pod查看进度/日志;对pod执行一个脚本/命令; 不适用于大量连接建立的情况: pod启的数据库服务;pod启的Api服务;pod启的前端服务;pod启的Oss服务; Portforward简介 Portforward就是端…

MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合

2024小结&#xff1a;在写作分享上&#xff0c;这里特别感谢CSDN社区提供平台&#xff0c;支持大家持续学习分享交流&#xff0c;共同进步。社区诚意满满的干货&#xff0c;让大家收获满满。 对我而言&#xff0c;珍惜每一篇投稿分享&#xff0c;每一篇内容字数大概6000字左右&…

【微服务】面试 7、幂等性

幂等性概念及场景 概念&#xff1a;多次调用方法或接口不改变业务状态&#xff0c;重复调用结果与单次调用一致。例如在京东下单&#xff0c;多次点击提交订单只能成功一次。场景&#xff1a;包括用户重复点击、网络波动导致多次请求、mq 消息重复消费、代码中设置失败或超时重…

漏洞扫描工具

完整源码项目包获取→点击文章末尾名片&#xff01; 漏洞检测 该模块主要是对目标Web系统进行安全漏洞扫描&#xff0c;包括SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、弱密码、中间件漏洞。中间件漏洞扫描包括对Weblogic、Struts2、Tomcat 、Jboss、Drupal、Nexus的已…

Mysql--基础篇--多表查询(JOIN,笛卡尔积)

在MySQL中&#xff0c;多表查询&#xff08;也称为联表查询或JOIN操作&#xff09;是数据库操作中非常常见的需求。通过多表查询&#xff0c;你可以从多个表中获取相关数据&#xff0c;并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作&#xff0c;每种JOIN都有…

【数据结构】第1天之Java中的数据结构

前言 众所周知&#xff0c;程序数据结构算法&#xff0c;可见数据结构的重要性。 在Java中&#xff0c;数据结构通常指的是Java集合框架中的类和接口。 Java集合框架提供了一套标准的数据结构&#xff0c;例如列表、集合、映射表等&#xff0c;以及相应的实现类。 今天要分享的…

js代理模式

允许在不改变原始对象的情况下&#xff0c;通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后&#xff0c;添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…

docker-compose方式部署单机版RocketMQ

1、准备工作目录和配置文件 rocketmq\_ conf/broker.conf\_ docker-compose.yml在 rocketmq/conf/ 目录下面&#xff0c;创建broker.conf文件&#xff1a; # Broker所属的集群名称&#xff0c;默认是DefaultCluster brokerClusterNameDefaultCluster# Broker的名称 brokerNam…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

爬虫基础之爬取歌曲宝歌曲批量下载

声明&#xff1a;本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…

Java 如何传参xml调用接口获取数据

传参和返参的效果图如下&#xff1a; 传参&#xff1a; 返参&#xff1a; 代码实现&#xff1a; 1、最外层类 /*** 外层DATA类*/ XmlRootElement(name "DATA") public class PointsXmlData {private int rltFlag;private int failType;private String failMemo;p…

java项目之在线文档管理系统源码(springboot+mysql+vue+文档)

大家好我是风歌&#xff0c;曾担任某大厂java架构师&#xff0c;如今专注java毕设领域。今天要和大家聊的是一款基于springboot的在线文档管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 在线文档管理系统的主要使用者分为管…

学技术步骤,(tomcat举例)jar包api手写tomcat静态资源基础服务器

1.看有哪些包&#xff0c;能用本地离线的包就使用离线包 2.尽量不要使用配置文件&#xff08;先不用&#xff09;&#xff0c;能用api就用api&#xff0c; 因为配置文件只是文本&#xff0c;其实要的只是配置文件里的参数&#xff0c; 这些参数最后肯定还是要给到这些api去处…

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起&#xff0c;支持了列存引擎&#xff0c;允许表和索引以行存、纯列存或行列冗余的形式创建&#xff0c;且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外&#xff0c;也有用户询问如何通过SQL语句…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

数据结构-排序课后题

今天我们来简单的说说关于排序的一些课后练习题. 对应的知识点博客: LINK. 目录 1. 每一单趟都能确定一个数字的最终位置的排序2. 根据序列变化确定排序方式3. 排序顺序对哪些排序效率影响不大?4. 对有序序列排序最费力的排序方式是什么?5. 对接近有序序列排序最快的排序方式…

MySQL 架构

MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器的连接器。整体架构图如下所⽰&#xff1a; MySQL Connectors&#xff1a;为使⽤…

【数据结构】二叉搜索树

目录 1. 二叉搜索树的概念 2. 二叉搜索树的性能分析 3.二叉搜索树的实现 3. 1.二叉搜索树的插入 3.2. 二叉搜索树的查找 3.3. 二叉搜索树的删除 3.4. 二叉搜索树的实现代码 4. 二叉搜索树key和key/value两种使用场景 4.1 key搜索场景&#xff1a; 4.2 key/value搜索场…

【C++】string的关系运算与比较分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;基础知识&#xff1a;C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 &#x1f4af;代码解析与扩展代码例一&#xff1a;相等比较代码解析输出 代码例二&a…