一篇文章掌握Maven

Maven是什么?

Maven,这个单词来源于犹太语,意味着知识的积累。最初在Jakarta Turbine 项目中用来简化构造项目流程。最终,形成基于Java项目的构建和管理的工具。

安装与配置

安装比较简单,官网下载,配置环境即可。这里推荐一下,安装之后配置仓库镜像,可以加快访问速度。

编辑 settings.xml,在 </mirrors>之前添加

 
  1. <mirror>

  2. <id>nexus-aliyun</id>

  3. <mirrorOf>central</mirrorOf>

  4. <name>Nexus aliyun</name>

  5. <url>http://maven.aliyun.com/nexus/content/groups/public</url>

  6. </mirror>

Maven 创建项目

创建基本的Java项目

 
  1. mvn archetype:generate

  2. -DgroupId=com.mycompany.app

  3. -DartifactId=my-app

  4. -DarchetypeArtifactId=maven-archetype-quickstart

  5. -DinteractiveMode=false

使用其他工具创建项目也如出一辙。

Maven项目结构

一篇文章掌握Maven

Maven 基本概念

POM(Project Object Model)

POM的全称是Project Object Model,用通俗点的话说就是对要构建的项目进行建模,将要构建的项目看成是一个对象(Object)。

我们可以用我们熟悉的一个Java代码来描述一下这个对象。

 
  1. package cn.iisheng.maven;

  2. import java.util.Set;

  3. /**

  4. * @author iisheng

  5. * @date 2019/12/05 15:12:01

  6. */

  7. public class ProjectObject {

  8. /**

  9. * 表示组织或者组织的项目唯一的标识符

  10. */

  11. private String groupId;

  12. /**

  13. * 表示项目内部组件的标识

  14. */

  15. private String artifactId;

  16. /**

  17. * 打包方式

  18. */

  19. private String packaging;

  20. /**

  21. * 表示该artifact 版本号

  22. */

  23. private String version;

  24. /**

  25. * 依赖的其他项目

  26. */

  27. private Set<ProjectObject> dependencies;

  28. /**

  29. * 父级项目

  30. */

  31. private ProjectObject parent;

  32. /**

  33. * 子模块项目

  34. */

  35. private Set<ProjectObject> modules;

  36. // 下面几个属性 仅仅用于生成文档

  37. /**

  38. * 项目展示名字

  39. */

  40. private String name;

  41. /**

  42. * 项目网址

  43. */

  44. private String url;

  45. /**

  46. * 项目描述

  47. */

  48. private String description;

  49. }

Lifecycle(生命周期)

在Maven中一次构建过程就是一个Lifecycle,这个Lifecycle分为多个阶段,每个阶段叫做Phase。有三种构建的生命周期,分别是 defaultcleansitedefault用于部署项目, clean用于清理项目,而 site用于创建项目文档。

defaultLifecycle包含如下Phase:

  • validate:校验项目和一些必要信息是可用的

  • compile:编译项目源码

  • test:执行源码的单元测试模块

  • package:将项目打包,比如打包成jar文件

  • verify:对集成测试的结果进行检查,以确保满足质量标准

  • install:将软件包安装到本地仓库中

  • deploy:将软件包部署到远程仓库

maven 常用命令介绍

清理项目产生的临时文件,一般是模块下的target目录

 
  1. mvn clean

项目打包工具,会在模块下的target目录生成jar或者war等文件

 
  1. mvn package

测试命令或者执行src/test/java下面的测试用例

 
  1. mvn test

模块安装命令,将打包的jar或者war文件复制到本地仓库,使用-Dmaven.test.skip=true 跳过测试

 
  1. mvn install

发布命令,将打包的文件发布到maven仓库

 
  1. mvn deploy

maven 多个命令同时使用

 
  1. 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配置项目依赖,比如

 
  1. <dependency>

  2. <groupId>junit</groupId>

  3. <artifactId>junit</artifactId>

  4. <version>4.12</version>

  5. <scope>test</scope>

  6. </dependency>

scope用来控制依赖和编译、测试、运行的classpath的关系。有下面三种关系:

  • compile:默认编译依赖范围。对于编译、测试、运行三种classpath都有效

  • test:测试依赖范围。只对测试classpath有效

  • provided:已提供依赖范围。编译、测试classpath有效,对于运行无效。

  • runtime:运行时提供

  • test:仅用于测试,且不可传递

  • system:类似于provided,但必须显示提供JAR

  • import:仅在 dependencyManagement下支持。

传递依赖

Maven是通过传递依赖解析JAR包依赖,比如我项目中引入junit,在解析我的项目的时候,不仅仅仅有junit,还有junit依赖的JAR包。

一篇文章掌握Maven

包冲突时怎么产生的?

假设 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包。

如何移除依赖?

 
  1. <dependency>

  2. <groupId>junit</groupId>

  3. <artifactId>junit</artifactId>

  4. <version>4.12</version>

  5. <exclusions>

  6. <exclusion>

  7. <groupId>org.hamcrest</groupId>

  8. <artifactId>hamcrest-core</artifactId>

  9. </exclusion>

  10. </exclusions>

  11. </dependency>

Maven聚合

模块化,各个模块看起来更清晰。更主要的优点是,在项目根目录构建项目的时候,下面所有module里面的项目都会跟着同时构建。

 
  1. <modules>

  2. <module>study-common</module>

  3. <module>study-dao</module>

  4. <module>study-service</module>

  5. <module>study-web</module>

  6. </modules>

Maven继承

继承为了消除重复。可以把很多相同的配置提取出来。

子模块通过 parent标签配置,继承父模块属性。父模块通过 dependencyManagement标签进行管理。

多模块版本号可以通过maven命令操作,在项目根目录执行

设置新版本号

 
  1. mvn versions:set -DnewVersion=0.0.2-SNAPSHOT

回滚设置新版本号操作

 
  1. mvn versions:revert

提交设置新版本号操作

高质量编程视频shangyepingtai.xin
  1. mvn versions:commit

Maven多模块项目结构,以及Maven属性继承配置等,可以参考这个项目https://github.com/iisheng/mybatis-study

发布了122 篇原创文章 · 获赞 47 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/fengzongfu/article/details/105323901