文章目录
- 一、POM的四个层次
- 超级POM
- 父POM
- 当前POM
- 有效POM(effective pom)
- 二、属性的声明和引用
- 使用 mvn help:evaluate查看属性
- 通过Maven访问系统属性
- 1、访问Java系统属性
- 2、访问系统属性
- 4、访问系统环境变量
- 5、访问project属性
- 访问一级标签
- 访问子标签
- 访问标签列表
- 6、访问全局配置settings
- 三、Build标签详解
- 3.1 如何查看build标签
- 3.2 标签的组成
- 3.2.1 各个标签的作用
- 3.2.2 备用插件管理
- 3.2.3 生命标签插件
- 生命标签插件小结
- 3.3 典型应用
- 应用1:指定JDK版本
- 应用2:SpringBoot 定制化打包
- 应用3:Mybatis的逆向工程
一、POM的四个层次
超级POM
POM确实存在继承关系,如果一个POM没有指定继承的POM,也会默认继承一个超级POM
经过我们前面的学习,我们看到 Maven 在构建过程中有很多默认的设定,例如:源文件存放的目录、测试源文件存放的目录、构建输出的目录.…等等。但是其实这些要素也都是被 Maven 定义过的。定义的位置就是:超级POM.
超级Pom的内容:
- 指定默认的maven仓库
- build标签,定义文件构建路径
- 指定默认插件
- 等等
父POM
明确指定继承关系
当前POM
最关注,使用最多的一层,配置POM主要配置的就是当前POM
有效POM(effective pom)
当前POM叠加超级POM和父POM,组成最终的有效POM文件。
配置优先级以子级优先
使用mvn help:effective-pom
指令即可查看有效pom
二、属性的声明和引用
使用 mvn help:evaluate查看属性
输入指令 mvn help:evaluate
,直到出现如下提示后
通过Maven访问系统属性
1、访问Java系统属性
使用java代码获取
public static void main(String[] args) {Properties properties = System.getProperties();properties.list(System.out);
}
内容如下:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\javaapp\jdk1.8\jre\bin
java.vm.version=25.202-b08
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
.....
只要是能号展示出来的变量,POM都可以获取,举个例子
2、访问系统属性
比如${java.runtime.name}
4、访问系统环境变量
加上env
即可,比如${env.JAVA_HOME}
5、访问project属性
可以使用project.xxx
来访问当前POM中的元素值
访问一级标签
${project.标签名}
访问子标签
${project.子标签.标签名}
访问标签列表
${project.子标签.标签名[下标]}
比如声明了一些子模块
6、访问全局配置settings
前缀加${settings.xxx}
,访问全局配置
三、Build标签详解
3.1 如何查看build标签
在实际使用 Maven 的过程中,我们会发现 build 标签有时候有,有时候没,这是怎么回事呢?其实通过有效POM 我们能够看到,build 标签的相关配置其实一直都在,只是在我们需要定制构建过程的时候才会通过配置build 标签覆盖默认值或补充配置。
这一点我们可以通过打印有效 POM 来看到。mvn help:effective-pom
配置build标签是对超级POM的补充配置,只有在默认的配置无法满足时,才会修改该标签。
3.2 标签的组成
3.2.1 各个标签的作用
3.2.2 备用插件管理
通过 pluginManagement
标签管理起来的插件就像 dependencyManagement
一样,子工程使用时可以省略版本号,起到在父工程中统一管理版本的效果
3.2.3 生命标签插件
执行部分:excutions
标签里有多个excution标签
- id 指定唯一标识
- phase:管理的声明周期阶段
- clean
- test
- compile
- install
- 等等
- goals : 关联指定的声明周期的目标
- 当配置多个goal标签时,标识一个生命周期环节可以对应当前插件的多个目标
另外,还可以对插件目标的执行过程进行配置*(非常深入的时候)*。举个例子
生命标签插件小结
每个插件能做哪些设置,都是具体插件自己规定的,不能一概而论
3.3 典型应用
应用1:指定JDK版本
常见的通过在父级POM指定jdk版本
<!--构建相关的配置--><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins></build>
应用2:SpringBoot 定制化打包
很显然spring·boot-maven·plugin
并不是 Maven 自带的插件,而是 SpringBoot 提供的,用来改变 Maven 默认的构建行为。具体来说是改变打包的行为。默认情况下 Maven 调用 maven-jar·plugin 插件的jar 目标,生成普通的jar 包。
普通 jar 包没法使用 java -jar xxx.jar 这样的命令来启动、运行,但是 SpringBoot 的设计理念就是每一个『微服务』导出为一个jar 包,这个jar 包可以使用 java -jar xxx.jar
这样的命令直接启动运行。这样一来,打包的方式肯定要进行调整,所以SpringBoot提供了 spring·boot.maven·plugin 这个插件来定制打包行为。
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.15</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins><finalName>${project.artifactId}</finalName>
</build>
应用3:Mybatis的逆向工程
逆向工程的操作是以构建过程中插件形式出现的(在导入插件时,还会像插件内导入依赖)
比如在导入mybatis代码生成的时候,还会根据具体的需要导入一些数据库连接池,驱动等插件