Maven是什么?
Maven,这个单词来源于犹太语,意味着知识的积累。最初在Jakarta Turbine 项目中用来简化构造项目流程。最终,形成基于Java项目的构建和管理的工具。
安装与配置
安装比较简单,官网下载,配置环境即可。这里推荐一下,安装之后配置仓库镜像,可以加快访问速度。
编辑 settings.xml
,在 </mirrors>
之前添加
-
<mirror>
-
<id>nexus-aliyun</id>
-
<mirrorOf>central</mirrorOf>
-
<name>Nexus aliyun</name>
-
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
-
</mirror>
Maven 创建项目
创建基本的Java项目
-
mvn archetype:generate
-
-DgroupId=com.mycompany.app
-
-DartifactId=my-app
-
-DarchetypeArtifactId=maven-archetype-quickstart
-
-DinteractiveMode=false
使用其他工具创建项目也如出一辙。
Maven项目结构
Maven 基本概念
POM(Project Object Model)
POM的全称是Project Object Model,用通俗点的话说就是对要构建的项目进行建模,将要构建的项目看成是一个对象(Object)。
我们可以用我们熟悉的一个Java代码来描述一下这个对象。
-
package cn.iisheng.maven;
-
import java.util.Set;
-
/**
-
* @author iisheng
-
* @date 2019/12/05 15:12:01
-
*/
-
public class ProjectObject {
-
/**
-
* 表示组织或者组织的项目唯一的标识符
-
*/
-
private String groupId;
-
/**
-
* 表示项目内部组件的标识
-
*/
-
private String artifactId;
-
/**
-
* 打包方式
-
*/
-
private String packaging;
-
/**
-
* 表示该artifact 版本号
-
*/
-
private String version;
-
/**
-
* 依赖的其他项目
-
*/
-
private Set<ProjectObject> dependencies;
-
/**
-
* 父级项目
-
*/
-
private ProjectObject parent;
-
/**
-
* 子模块项目
-
*/
-
private Set<ProjectObject> modules;
-
// 下面几个属性 仅仅用于生成文档
-
/**
-
* 项目展示名字
-
*/
-
private String name;
-
/**
-
* 项目网址
-
*/
-
private String url;
-
/**
-
* 项目描述
-
*/
-
private String description;
-
}
Lifecycle(生命周期)
在Maven中一次构建过程就是一个Lifecycle,这个Lifecycle分为多个阶段,每个阶段叫做Phase。有三种构建的生命周期,分别是 default
、 clean
、 site
。default
用于部署项目, clean
用于清理项目,而 site
用于创建项目文档。
default
Lifecycle包含如下Phase:
-
validate:校验项目和一些必要信息是可用的
-
compile:编译项目源码
-
test:执行源码的单元测试模块
-
package:将项目打包,比如打包成jar文件
-
verify:对集成测试的结果进行检查,以确保满足质量标准
-
install:将软件包安装到本地仓库中
-
deploy:将软件包部署到远程仓库
maven 常用命令介绍
清理项目产生的临时文件,一般是模块下的target目录
-
mvn clean
项目打包工具,会在模块下的target目录生成jar或者war等文件
-
mvn package
测试命令或者执行src/test/java下面的测试用例
-
mvn test
模块安装命令,将打包的jar或者war文件复制到本地仓库,使用-Dmaven.test.skip=true 跳过测试
-
mvn install
发布命令,将打包的文件发布到maven仓库
-
mvn deploy
maven 多个命令同时使用
-
mvn clean package -U -Dmaven.test.skip=true -P test
Phase和Goals
Lifecycle只规定了项目构建的流程,即先执行 validate
,再 compile
等一系列Phase,但并没有定义每一个Phase具体做什么。这里Phase的作用类似于Java中的接口,而Phase的具体实现在Goals里面。
一个Phase必须绑定一个或多个Goals,才能执行具体的构建流程。为了让用户不用任何配置就能使用Maven项目,Maven默认为一些核心生命周期的Phase绑定了Goals。
如果需要自定义绑定,可以在 pom.xml
文件中配置。
Maven核心概念
Maven坐标
Maven坐标主要是为了标识项目的唯一性。由下面几个属性组成:
-
groupId:组织或者组织的项目名称
-
artifactId:项目中的具体模块
-
version:项目版本
-
packaging:项目打包方式
-
classifier:用于区分从同一POM构建的具有不同内容的构件
Maven仓库
存储管理构件(JAR、WAR等)的地方。
一般分为以下三类:
-
本地仓库:默认是
~/.m2/repository
目录,可在配置文件中配置其他目录 -
私服:内网的Maven仓库
-
中央仓库:Maven社区提供的仓库,包含大量的常用库
Maven依赖
在 pom.xml
配置项目依赖,比如
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.12</version>
-
<scope>test</scope>
-
</dependency>
scope
用来控制依赖和编译、测试、运行的classpath的关系。有下面三种关系:
-
compile:默认编译依赖范围。对于编译、测试、运行三种classpath都有效
-
test:测试依赖范围。只对测试classpath有效
-
provided:已提供依赖范围。编译、测试classpath有效,对于运行无效。
-
runtime:运行时提供
-
test:仅用于测试,且不可传递
-
system:类似于provided,但必须显示提供JAR
-
import:仅在
dependencyManagement
下支持。
传递依赖
Maven是通过传递依赖解析JAR包依赖,比如我项目中引入junit,在解析我的项目的时候,不仅仅仅有junit,还有junit依赖的JAR包。
包冲突时怎么产生的?
假设 A->B->C->D1, E->F->D2,D1、D2 分别为 D 的不同版本。
如果 pom.xml
文件中引入了 A 和 E 之后,按照 Maven 传递依赖原则,工程内需要引入的实际 JAR 包将会有:A B C D1 和 E F D2,因此 D1、D2 将会产生包冲突。
如何解决包冲突?
Maven解析 pom.xml
的时候,同一个JAR包只会保留一个。
对于包冲突,Maven处理策略:
-
最短路径优先:Maven面对 D1 D2,会选择最短路径的那个,即D2。因为,E->F->D2 比 A->B->C->D1 路径短。
-
最先声明优先:如果路径一样,就选择最先声明的JAR包。
如何移除依赖?
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.12</version>
-
<exclusions>
-
<exclusion>
-
<groupId>org.hamcrest</groupId>
-
<artifactId>hamcrest-core</artifactId>
-
</exclusion>
-
</exclusions>
-
</dependency>
Maven聚合
模块化,各个模块看起来更清晰。更主要的优点是,在项目根目录构建项目的时候,下面所有module里面的项目都会跟着同时构建。
-
<modules>
-
<module>study-common</module>
-
<module>study-dao</module>
-
<module>study-service</module>
-
<module>study-web</module>
-
</modules>
Maven继承
继承为了消除重复。可以把很多相同的配置提取出来。
子模块通过 parent
标签配置,继承父模块属性。父模块通过 dependencyManagement
标签进行管理。
多模块版本号可以通过maven命令操作,在项目根目录执行
设置新版本号
-
mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
回滚设置新版本号操作
-
mvn versions:revert
提交设置新版本号操作
高质量编程视频shangyepingtai.xin
-
mvn versions:commit
Maven多模块项目结构,以及Maven属性继承配置等,可以参考这个项目https://github.com/iisheng/mybatis-study