在上篇文章中我们了解了Maven:https://blog.hackyle.net/index.php/tools/maven-basic/,接下来我们将深入了解Maven的核心:pom.xml
什么是pom.xml
POM(Project Object Model):项目对象模型。
- Maven把一个项目的结构和内容抽象成一个模型,在xml文件中进行声明,以方便进行构建和描述,pom.xml是Maven的灵魂。相当于JavaWeb工程的web.xml。
- 所以,maven环境搭建好之后,所有的学习和操作都是关于pom.xml的。
- modelVersion:Maven模型的版本,对于 Maven2和 Maven3来说,它只能是4.0.0
坐标
什么是坐标:
- 在互联网中唯一标识一个项目
- 由groupId、artifactId、version共同标识一个坐标
- groupId:组织ID,一般是公司域名的倒写。例如,百度可以指定groupId为:com.baidu
- artifactId:项目名称(模块名称),对应groupId中项目中的子项目。也要保持唯一。例如,百度地图可以指定为:baiduMap
- version:项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带”-SNAPSHOT”。version使用三位数字标识,例如1.1.2
从中央仓库获取Jar:
- 进入https://mvnrepository.com/
- 输入关键字进行搜索(例如我搜索:mysql),点击想要的版本:
打包
packaging
- 打包后压缩文件的拓展名,默认是jar,web应用是war
- 也可以不写,默认就是jar
依赖
什么是依赖:
- dependencies 和dependency,相当于是 java代码中import
- 因为Maven的一个重要作用就是管理jar包,这个标签就是指定项目中使用的第三方包的位置
scope
什么是scope标签
- 作用:指定依赖(也就是Jar包)在哪个阶段使用。阶段有编译,测试,打包,安装,部署。
- scope的值有:
- compile:编译时候才用。默认是compile
- test:测试的时候才用
- provided:表明该Jar包(依赖)不参与打包、安装、部署阶段。
依赖的传递:
好处:不用再每个模块工程中都重复声明。
注意:非compile范围的依赖不能传递。
依赖的排除:
依赖排除实例
配置属性properties
什么是配置属性properties
- 是用来设置一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码。
- 定义全局变量,通过“${属性名}”引用变量的值。
properties标签实例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
其他标签
<!--设置Maven的属性-->
<properties>
<!--设置编码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译Java代码的JDK版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<!--代码运行的JDK版本,与上一个标签中的版本保持一致-->
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
其他标签
</project>
统一版本号
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.hackyle</groupId>
<artifactId>MavenJavaWeb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring-version>5.2.6.RELEASE</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
</project>
构建build
构建build:
- build表示与构建相关的配置,例如设置编译插件的jdk版本
- 同时也控制Maven自身的配置参数
继承
什么是继承parent:
- 如果多个模块都需要声明相同的配置,例如:有相同的依赖、或者相同的组件配置等。那我们就把这些相同的部分抽取出来放在一个“父工程”中。
- 这样也方便修改和统一管理。
例子:
- Aaa模块中依赖的Junit为4.0,Bbb模块中依赖的Junit为4.9,Ccc模块中依赖的Junit为4.1。在同一个项目的各个模块的版本都不一致,容易出问题。
- 所以我们需要统一管理各个模块工程中对Junit依赖的版本。
- 解决思路:将Junit依赖统一提取到“父”工程中,在子工程中声明Junit依赖是不指定版本,以父工程中统一设定的为准。
如何实现一个父工程:
1) 创建一个Maven工程作为父工程。打包方式为pom。
2) 在子工程中声明对父工程的引用
3) 将子工程的坐标中与父工程坐标中重复的内容删除
4) 注意:配置继承后,执行安装命令时先安装父工程。
聚合
什么是聚合modules
- 对于使用了继承方式的项目(即有父工程)
- 以往在安装的时候需要先安装父工程,这样还不够自动化。所以引入聚合,一键安装各个模块工程。
具体操作步骤:
- 在父工程中配置各个参与聚合的模块
- 在父工程上执行Run As-Maven Install