Maven强大的Java工程构建工具,做Java开发时少了跟Maven打交道,之前在知乎上看到有人提问:“学Java开发需不需要学习Maven?”,个人认为是必需要学的,这和工欲善其事必先利其器是一个道理,开发软件也要先把工具学好才能事半功倍啊。所以最近花了一点时间,将Maven的基础知识整理成一张脑图:

这篇文件主要简单介绍一些Maven中的概念,文章大致内容如下:

  • 安装maven
  • 配置maven
  • maven的命令语法
  • maven的构建征集周期

其他的一些高级特性如依赖、插件、settings部分留待之后再整理成。

安装Maven

安装Maven的步骤非常简单、快速,安装之前先确认JAVA_HOME环境变量是否指向JDK主目录可以使用echo命令输出JAVA_HOME目录:

echo $JAVA_HOME

如果输出为空说明JAVA_HOME未设置或指向不正确,可以使用export导出JAVA_HOME变量:

export JAVA_HOME=/path/to/java_home/

要使JAVA_HOME变量开机生效,可以将JAVA_HOME=/path/to/java_home/放入.profile.bash_profile视机器环境而定。

设置好JAVA_HOME环境变量后,就可以安装Maven了:

  1. 下载 apache-maven-3.6.3-bin.zip
  2. 使用unzip命令解压apache-maven-3.6.3-bin.zip压缩文件
  3. 添加一个MAVEN_HOME环境变量,指向解压后的apache-maven-3.6.3-bin目录
  4. MAVEN_HOME/bin添加PATH环境变量中

下载 Maven

wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip

解压 Maven

unzip apache-maven-3.6.3-bin.zip

设置MAVEN_HOME环境变量

cd apache-maven-3.6.3
pwd #查看当前目录
export MAVEN_HOME=/Users/yjwfn/bin/apache-maven-3.6.3

设置PATH环境变量

export PATH=$PATH:$MAVEN_HOME/bin

以上配置只是当前shell终端生效,要每次开机自动设置需要将以上命令放入~/.bash_profile~/.profile中,本文使用~/.bash_profile(不同的机器名称会不一样,Linux一般叫~/.profile):

vi ~/.bash_profile

将以下命令复制到文件中:

export MAVEN_HOME=/Users/yjwfn/bin/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin

验证安装

使用which mvn命令验证安装是否正确,查看输出mvn位置是否正确:

liuweideMacBook-Pro:bin yjwfn$ which mvn
/Users/yjwfn/bin/apache-maven-3.6.3/bin/mvn

使用mvn -v查看安装的 Maven 版本是否正确(因为有些系统会自带 Maven):

liuweideMacBook-Pro:bin yjwfn$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/yjwfn/bin/apache-maven-3.6.3
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"

运行 Maven

运行 Maven 命令的基本样式由optionsgoal(s)phase(s)组成:

mvn [options] [<goal(s)>] [<phase(s)>]

所有的options可以使用mvn -h查看:

liuweideMacBook-Pro:bin yjwfn$ mvn -h

usage: mvn [options] [<goal(s)>] [<phase(s)>]

Options:
-am,--also-make If project list is specified, also
....

Maven 命令的重点是goal(s)phase(s)这两个概念,字面意思注是目标、阶段的意思。他们的使用和另外一个概念life cycles有关,后面会详细解释。现在只需要明白一条Maven命令由多个optionsgoal(s)phase(s)组成。

Maven配置

Maven 有三个可以修改配置的地方:

  • MAVEN_OPTS 环境变量:向全局Maven提供额外的选项,如JVM配置参数-Xms256m -Xmx512m
  • settings.xml:文件位于USER_HOME/.m2目录中,向多个Maven项目提供统一的配置
  • .mvn目录:该目录位工程目录根目录中,是个隐藏的文件
    • extensions.xml
    • maven.config
    • jvm.config

MAVEN_OPTS 使用

MAVEN_OPTS是一个环境变量,默认是空的。为测试将MAVEN_OPTS设置成-h

export MAVEN_OPTS=-h #加个-h选项

然后执行mvn不带任务参数就打印出usage:

用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)

注意: 仔细一看这个usage其实是Java命令输出的java -h

iuweideMacBook-Pro:bin yjwfn$ java -h
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)

测试java -h与将MAVEN_OPTS设置成-h然后执行mvn打印出来的效果一致,所以MAVEN_OPTS大家应该知道怎么用了吧!要往JVM传递参数可以通过MAVEN_OPTS变量设置

settings.xml 文件

settings.xml 可以放在两个地址:

  • $MAVEN_HOME/conf/settings.xml
  • USER_HOME/.m2

$MAVEN_HOME就是安装步骤中设置的环境变量,settings.xml的加载可以打开--debug选项查看:

mvn --debug
# 部分控制台输出
[DEBUG] Reading global settings from /Users/yjwfn/bin/apache-maven-3.6.3/conf/settings.xml
[DEBUG] Reading user settings from /Users/yjwfn/.m2/settings.xml

如控制台输出一样,会在$MAVEN_HOMEUSER_HOME/.m2中加载两个settings.xml文件。settings.xml的配置项非常多,就不详细说明了可以查看官方文档。

.mvn目录

.mvn目录位于工程根目录中,是工程级的配置一般包含三个配置文件:

  • extensions.xml
  • maven.config
  • jvm.config
Maven Extensions

extensions.xml是为了使开发者更方便的使用Extensions功能建立的配置文件,Extensions是一种添加库到Core Classloader的方式Maven主要有四类System Classloader -> Core Classloader -> Plugin Classloaders -> Custom Classloaders由于CloassLoader都是双亲委派模式,所以添加到Core Classloader中的库可以在Plugin ClassloadersCustom Classloaders中使用:

extensions.xml的配置演示:

extensions.xml这个配置文件就是声明哪些库需要添加到Core Classloader中,如下声明将guava添加到Core Classloader中:

<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
<extension>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</extension>
</extensions>
maven.config

maven.config主要用于添加通用选项,在执行mvn命令时会将maven.config中配置的命令options添加到命令中。

新建个maven.config文件,内容如下:

-v

直接执行mvn不带任何选项,由于在maven.config中有-v选项,所以打出的内容就是mvn -v

liuweideMacBook-Pro:.mvn yjwfn$ mvn
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/yjwfn/bin/apache-maven-3.6.3
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
liuweideMacBook-Pro:.mvn yjwfn$
jvm.config

jvm.config是配置JVM参数的文件,很容易理解就不多说了。

Maven 构建生命周期

构建生命周期就Maven较核心的概念, Maven有三个内置的构建生命周期分别为:cleandefaultsite

构建阶段(Build Phase)

在Maven中一个生命周期由一系列Build Phase组成,而每个生命周期都会有很多Build Phasedefault生命周期由以下Build Phase组成:

  • validate -确认项目正确并且所有必要的信息均可用
  • compile -编译项目的源代码
  • test-使用合适的单元测试框架测试编译后的源代码。这些测试不应要求将代码打包或部署
  • package -获取编译后的代码,并将其打包为可分发的格式,例如JAR。
  • verify -对集成测试的结果进行任何检查,以确保符合质量标准
  • install -将软件包安装到本地存储库中,以作为本地其他项目中的依赖项
  • deploy -在构建环境中完成后,将最终软件包复制到远程存储库中,以便与其他开发人员和项目共享。

这些生命周期阶段(加上此处未显示的其他生命周期阶段)将顺序执行以完成default生命周期。给定上面的生命周期阶段,这意味着当使用default生命周期时,Maven将首先验证项目,然后尝试编译源代码,针对测试运行源代码,打包二进制文件(例如jar),针对该源运行集成测试软件包,验证集成测试,将经过验证的软件包安装到本地存储库,然后将已安装的软件包部署到远程存储库。

插件目标(Plugin Goals)

Build Phase只是定义一些软件构建的流程,它不会直接去构建工程,这些构建流程的实施都是由插件来做的,构建生命周期可以这样理解一个生命周期由多个构建阶段组成,每个构建阶段都会被多个插件目标绑定,用一张图表示他们之间的关系:

图中的jar:jar install:installplugin:goal的意思,冒号的前面部分是插件名称,后面是目标名称。由上图可知当执行mvn install的命令时,会执行default生命周期中的install阶段(同时在install之前的阶段也会执行),由于install:install目标绑定到了install phase,所以install:install目标也会执行,这样就通过install插件来完成打包功能。

总结

Maven是非常流行的构建工具,下一代构建工具Gradle也有一些点是借鉴了Maven。文中所提到的点只是Maven工具的一部分知识,Maven还有很多强大的功能如:依赖管理、插件管理、多工程等功能,后续再整理这些高级功能与大家分享。

公众号《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性能、高稳定)、大数据、机器学习、Java架构等各个热门领域。

开局一张图,学一学项目管理神器Maven!的更多相关文章

  1. 一句话+两张图搞定JDK1.7HashMap,剩下凑字数

    JDK1.7 HashMap一探究竟 HashMap很简单,原理一看散列表,实际数组+链表;Hash找索引.索引若为null,while下一个.Hash对对碰,链表依次查.加载因子.75,剩下无脑扩数 ...

  2. 一张图学dockerfile

        Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文 ...

  3. PMP项目管理的49个过程,一张图让你全部了解

    项目管理的49个过程,看表格显得比较单调,印象也不是很深,所以今天小编就给大家发一张图片,可以用一张图就能生动又详细的了解PMP项目管理的49个过程.   大家看完是不是觉得一目了然了呢,图片上传后不 ...

  4. 一张图搞清楚PMBOK所有过程的使用

      很多参加PMP培训的学员大概都会有一个感受,上课时似乎每个知识点都听懂了,大的知识框架也弄明白了,但是所有这些串起来在实践中怎么用呀!说的再直接一点,在考试的时候这些过程和活动是以怎样的逻辑来应用 ...

  5. Nodejs学习笔记(三)——一张图看懂Nodejs建站

    前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...

  6. 一张图入门Python【中文版】

    好久没写了,就拿这张图作为开篇吧,重新梳理自己学习的东西,最近两年人工智能炒红了python,devops的提出也把开发.运维整合到了一起,作为一个运维工程师,随着企业自动化运维的提出,光会shell ...

  7. 想了解Java后端学习路线?你只需要这一张图!

    前言 学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把. 今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点.所谓不求最好,但求最全,学习Java后端的同学 ...

  8. 面试问了解Linux内存管理吗?10张图给你安排的明明白白!

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学 ...

  9. 一张图理清 Python3 所有知识点

    如果你前几天一直有关注 GitHub Trending,那你应该会留意到「Python3 in one pic」这个开源项目. 很多人学习python,不知道从何学起.很多人学习python,掌握了基 ...

随机推荐

  1. pat 1100 Mars Numbers(20 分)

    1100 Mars Numbers(20 分) People on Mars count their numbers with base 13: Zero on Earth is called &qu ...

  2. 领扣(LeetCode)字符串相加 个人题解

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...

  3. 如何使用Sping Data JPA更新局部字段

    问题描述 在更新数据时,有时候我们只需要更新一部分字段,其他字段保持不变.Spring Data JPA并未提供现成的接口,直接使用save()更新会导致其他字段被Null覆盖掉. 解决办法 通常有两 ...

  4. HTTP 协议漫谈

    转载出处:HTTP 协议漫谈 简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 HTTP 协 ...

  5. 继上篇-jquery ajax提交 本篇用ajax提交的数据去数据库查询

    上篇讲到如何用jquery ajax提交数据至后台,后台接收并返回给ajax.https://www.cnblogs.com/tiezhuxiong/p/11943328.html 今天我们把数据传到 ...

  6. day 27 网路编程 面向对象多继承

    知识补充: 字符串转化为字节 string1  = input(“请输入你的名字”) string1.encode('utf-8') 字节转化为字符串 byte1 = b"alex" ...

  7. 关于JMeter原子性相关探究

    1.背景 最近宝路遇到个项目,在使用JMeter过程中引发了一些思考,宝路尝试用各种方式去验证,进而有了今天"JMeter原子性"相关主题. 2.目的 探究JMeter的事务的原子 ...

  8. SpringSecurity环境下配置CORS跨站资源共享规则

    一.CORS简述 要说明CORS(Cross Origin Resourse-Sharing) 跨站资源共享,就必须先说同源策略.长话短说,同源策略就是向服务端发起请求的时候,以下三项必须与当前浏览器 ...

  9. 02 JavaScript数据类型、类型转换、注释

    JavaScript 数据类型 JavaScript 变量能够保存多种数据类型:数值.字符串值.数组.对象.undefined.null等等 var length = 7; // 数字 var las ...

  10. Flask入门学习——自定义一个url转换器

          我们知道,flask的url规则是可以添加变量部分的,这个参数变量是写在尖括号里的,比如:/item/<id>/,如果需要指出参数的类型要符合<converter:vai ...