Maven(三)
build标签
这个标签的功能还是蛮多的,我们一个一个说,先来介绍一下这个build这个标签,用于 控制项目构建的全过程,包括编译、测试、资源处理、打包等关键环节。也就是说只要和构建又关系的都可以在这个里面配置。
<plugins> | 定义构建过程中使用的插件及其配置 | 否 |
<pluginManagement> | 集中管理插件版本和基础配置(供子模块继承) | 否 |
<resources> | 控制主代码(src/main/resources )的资源文件处理 | 否 |
<testResources> | 控制测试代码(src/test/resources )的资源文件处理 | 否 |
<finalName> | 指定最终生成的构建产物名称(如JAR/WAR文件名) | 否 |
<directory> | 设置编译输出目录(默认:target/classes ) | 否 |
<outputDirectory> | 指定主代码编译输出路径(覆盖<directory> ) | 否 |
<testOutputDirectory> | 指定测试代码编译输出路径 | 否 |
<sourceDirectory> | 自定义主代码目录(默认:src/main/java ) | 否 |
<testSourceDirectory> | 自定义测试代码目录(默认:src/test/java ) | 否 |
<filters> | 指定属性过滤文件(如 src/main/filters/env.properties ) | 否 |
<extensions> | 启用构建扩展(如WAR插件需要<extension>true</extension> ) | 否 |
<plugins>标签
<plugin><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><executions><execution><id>default-compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>default-testCompile</id><phase>test-compile</phase><goals><goal>testCompile</goal></goals></execution></executions>
</plugin>
就以上面的这个为例,基本上就是全部的标签了,然后这个插件是什么意思之前也有讲过,其实就是对应相关的jar包执行对应的命令,上面就是对应的是maven的compiler命令,只是我们显示的把他加到pom里面,然后这个executions就是执行配置,里面的phase对应的就是maven的生命周期,goal对应的就是目标也就是这个jar包中对应的行为,理解成会做什么事就行了。但是一般情况下不同的插件的goal和phsqe都是不同的需要对应的文档去查看,一般这个executions标签就很少用了。另外我们所有的POM都有一个顶级的父类POM,就如同java的Object一样,很多配置POM里已经定义好了就如这个maven-compiler-plugin。
mvn help:effective-pom
我们可以使用这个目录来查看有效的pom文件,什么叫有效就是继承了所有的pom后,实际的pom到底是什么样子的,这个比较长这边就不演示了。使用这个插件标签其实是使用其他第三方的插件的,如SpringBoot的打包插件,目的就是把jar打包成可执行文件,可以把依赖一起打包到BOOT—INF到lib目录下,因为maven自带的插件不会把依赖也加到jar包中。
这两个就是不同的插件,第一个是普通的maven插件打包,第二个就是SpringBoot的插件打包,lib目录下是有对应的依赖文件的,可以直接部署的。
<pluginManagement>标签
这个标签其实和签一篇说的依赖管理标签dependencyManagement的作用是一样的,就是统一管理版本的,也是一样插件需要在子模块声明,不声明是无用的,声明后可以不用写版本和配置信息。
<!-- 无需写version和configuration,继承父POM -->
<resources>标签
用于 精细控制资源文件(如配置文件、静态资源)的处理方式,决定哪些文件会被复制到构建输出目录(如 target/classes
),以及如何处理这些文件。默认情况下,Maven 会自动复制 src/main/resources
下的所有文件到 target/classes
。通过 <resources>
可以:添加额外的资源目录、排除或包含特定文件、启用变量替换(如 ${property}
或 @property@
)也就是动态替换资源文件中的占位符(常用于多环境配置)。还有处理非标准资源例如将 src/main/java
中的 XML 文件(如 MyBatis Mapper)复制到输出目录。
简单来说,就是maven默认只会把src/main/resources
下的资源文件如.xml放到编译后的target/classes让程序在idea中运行可以找到,但有些资源文件是和java文件方一起的,那么就不会被放进来,因为maven只会编译src/main/java的.java文件,如果想把这个目录下的文件也放到target/classes下就得使用这个标签。
<build><resources><resource><directory>资源目录路径</directory><filtering>true/false</filtering> <!-- 是否启用变量替换 --><includes> <!-- 白名单:只包含哪些文件 --><include>文件匹配模式</include></includes><excludes> <!-- 黑名单:排除哪些文件 --><exclude>文件匹配模式</exclude></excludes><targetPath>输出子目录</targetPath> <!-- 可选 --></resource><!-- 可配置多个resource --></resources>
</build><resource><directory>src/main/java</directory><includes><include>**/*.xml</include> <!-- 复制MyBatis Mapper文件 --></includes>
</resource>
如果不加<includes>或者<excludes>标签,那么默认就是当前选择的资源文件的全部类型都会被加载(<excludes>优先级要比<includes>高,也就是如果两个标签都定义了同一个文件,那么最终会被排除),而这个 <filtering>就是要不要打开变量替换默认是关的。在 application.properties
中如下,yml也是同样可以替换的。
app.version=@project.version@ <!-- 编译后变成 app.version=1.0.0 -->
app.name=${project.name}
<extensions>标签
用于 启用或扩展构建系统的核心功能,通常用于加载特殊类型的依赖(如自定义打包格式、仓库传输协议等),简单来说就是扩展Maven功能的,和传统的依赖不同点在于,传统的依赖只是当前项目要用的东西,而这个是Maven可以用的东西,和我们说Jave的动态代理一样,是用来增强Maven的功能的。
也就是是导入第三方的扩展插件,可以增强maven的特点功能。
总结
本篇主要讲了maven的build标签及其子标签,其他的子标签的用处不是很多,而且本篇的内容也比较长了,我们下期再说吧