Maven核心插件之maven-resources-plugin

news2025/2/28 15:16:14

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.coloradmin.cn/o/2276337.html

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

相关文章

ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离&#xff0c;但是有些时候我们还会可以根据应用中的功能…

SOME/IP 协议详解——服务发现

文章目录 1. Introduction &#xff08;引言&#xff09;2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General&#xff08;概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置选项&#xff08;Co…

【大数据】机器学习-----最开始的引路

以下是关于机器学习的一些基本信息&#xff0c;包括基本术语、假设空间、归纳偏好、发展历程、应用现状和代码示例&#xff1a; 一、基本术语 样本&#xff08;Sample&#xff09;&#xff1a; 也称为实例&#xff08;Instance&#xff09;或数据点&#xff08;Data Point&…

基于物联网技术的污水处理厂解决方案

随着城市化进程的加快&#xff0c;污水处理成为保障城市生态环境的重要环节。传统污水处理方式存在效率低下、管理复杂、能耗高等问题。为了提升污水处理效率与管理水平&#xff0c;天拓四方提出基于物联网技术的污水处理厂解决方案&#xff0c;旨在实现污水处理过程的可视化、…

《分布式光纤传感:架设于桥梁监测领域的 “智慧光网” 》

桥梁作为交通基础设施的重要组成部分&#xff0c;其结构健康状况直接关系到交通运输的安全和畅通。随着桥梁建设规模的不断扩大和服役年限的增长&#xff0c;桥梁结构的安全隐患日益凸显&#xff0c;传统的监测方法已难以满足对桥梁结构健康实时、全面、准确监测的需求。分布式…

React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解

基础概念 Element对象与Fiber对象 Element对象与Fiber对象 Element 对象 定义 React 的 Element 对象是一个描述用户界面&#xff08;UI&#xff09;的普通 JavaScript 对象&#xff0c;通常由 React.createElement 或 JSX 语法生成。 作用 它是 React 应用中的一种描述 …

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…

在 Linux 下Ubuntu创建同权限用户

我是因为不小心把最开始创建的用户的文件夹颜色搞没了&#xff0c;再后来全白用习惯了&#xff0c;就不想卸载了&#xff0c;像创建一个和最开始创建的用户有一样的权限可以执行sudo -i进入root一样的用户 如图这是最原始的样子 第一步 创建新用户&#xff0c;我这里是因为之前…

Edge浏览器内置的截长图功能

Edge浏览器内置截图功能 近年来&#xff0c;Edge浏览器不断更新和完善&#xff0c;也提供了长截图功能。在Edge中&#xff0c;只需点击右上角的“...”&#xff0c;然后选择“网页捕获”->“捕获整页”&#xff0c;即可实现长截图。这一功能的简单易用&#xff0c;使其成为…

aws(学习笔记第二十三课) step functions进行开发(lambda函数调用)

aws(学习笔记第二十三课) 开发step functions状态机的应用程序 学习内容&#xff1a; step functions状态机的概念开发简单的step functions状态机 1. step functions状态机概念 官方说明文档和实例程序 AWS的官方给出了学习的链接和实例程序。使用SAM创建step functions 借…

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

浅谈云计算07 | 云安全机制

浅谈云计算安全机制&#xff1a;全方位守护云端世界 一、引言二、加密技术&#xff1a;数据的隐形护盾三、散列机制&#xff1a;数据完整性的忠诚卫士四、数字签名&#xff1a;数据来源与真伪的鉴定专家五、公钥基础设施&#xff08;PKI&#xff09;&#xff1a;信任的基石六、…

Vulnhub DC-9靶机实战

前言 这里说一下这个靶机的难点 1.这次sql注入是两个库的&#xff0c;在不使用sqlmap的情况下很多人直接database()看数据库&#xff0c;另一个库反倒没关注 2.nmap的扫描方式如果用-sT的tcp连接扫端口的话是扫不到那些被防火墙过滤的端口的&#xff0c;直接nmap ip就可以 3…

语音技术与人工智能:智能语音交互的多场景应用探索

引言 近年来&#xff0c;智能语音技术取得了飞速发展&#xff0c;逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制&#xff0c;再到企业客服和教育辅导&#xff0c;语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后&#xff0c;人工智能技术无疑是关键…

【Vim Masterclass 笔记10】S06L23:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第二部分)

文章目录 S06L23 Search, Find, and Replace - Part Two1 文本替换命令 :s/old/new/2 指定范围的文本替换3 特例&#xff1a;路径的替换4 文件行号的配置5 要点总结&#xff08;1&#xff09;搜索当前行&#xff08;Same Line Searching&#xff09;&#xff08;2&#xff09;跨…

Wallpaper壁纸制作学习记录14

交互式操控变形动画 操控变形动画与ScenceScript 结合使用还可用于创建交互式壁纸元素。在本次实例中&#xff0c;将讲解如何允许用户抓取和拖动单个骨骼。 交互式骨骼 这里提供了本次实例中的项目下载链接&#xff1a;果冻项目。 设置操控变形动画 为了实现这一点&#xff…

vscode 扩展Cline、Continue的差别?

Cline和Continue都是VSCode的AI编程插件&#xff0c;它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别&#xff1a; 一、功能差异 编辑功能 Cline&#xff1a;能够分析项目的文件结构和源代码抽象语法树&#xff08;AST&#xff09;&#xff0c;通…

【Rust自学】12.3. 重构 Pt.1:改善模块化

12.3.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读取…

excel设置好的可选择列数据后,如何快速输入到单元格中?

当设置好列的【数据】-【数据有效性】-【序列】后&#xff0c;在单元格中输入可选择数据的开头&#xff0c;就会提示出对应的可选择数据&#xff0c;然后&#xff0c;按一下键盘上的【↓】键&#xff0c;再按回车&#xff0c;即可快速输入到单元格中。

Vue3.5 企业级管理系统实战(二):Router、Pinia 及 Element-Plus 集成

1 Vue Router 集成 1.1 安装 vue-router 通过 pnpm 安装 Vue Router pnpm i vue-router 1.2 配置 Router 在 src 文件夹下新建 views 文件夹&#xff0c;新建文件 Home.vue 和 About.vue 在 src 文件夹下新建 router 文件夹&#xff0c;在 router 下新建 index.ts 用来配置…