Maven强大的Java工程构建工具,作Java开发时少了跟Maven打交道,以前在知乎上看到有人提问:“学Java开发需不须要学习Maven?”,我的认为是必须要学的,这和工欲善其事必先利其器
是一个道理,开发软件也要先把工具学好才能事半功倍
啊。因此最近花了一点时间,将Maven的基础知识整理成一张脑图:java
这篇文件主要简单介绍一些Maven中的概念,文章大体内容以下:shell
其余的一些高级特性如依赖、插件、settings部分留待以后再整理成。apache
安装Maven的步骤很是简单、快速,安装以前先确认JAVA_HOME
环境变量是否指向JDK主目录可使用echo
命令输出JAVA_HOME
目录:bash
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了:机器学习
unzip
命令解压apache-maven-3.6.3-bin.zip
压缩文件MAVEN_HOME
环境变量,指向解压后的apache-maven-3.6.3-bin
目录MAVEN_HOME/bin
添加PATH
环境变量中下载 Mavenjvm
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
解压 Mavenmaven
unzip apache-maven-3.6.3-bin.zip
设置
MAVEN_HOME
环境变量ide
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
命令的基本样式由options
、goal(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
命令由多个options
、goal(s)
、phase(s)
组成。
Maven 有三个能够修改配置的地方:
MAVEN_OPTS 环境变量
:向全局Maven
提供额外的选项,如JVM配置参数-Xms256m -Xmx512m
;settings.xml
:文件位于USER_HOME/.m2
目录中,向多个Maven
项目提供统一的配置.mvn
目录:该目录位工程目录根目录中,是个隐藏的文件
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
能够放在两个地址:
$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_HOME
和USER_HOME/.m2
中加载两个settings.xml
文件。settings.xml
的配置项很是多,就不详细说明了能够查看官方文档。
.mvn
目录.mvn
目录位于工程根目录中,是工程级的配置通常包含三个配置文件:
extensions.xml
是为了使开发者更方便的使用Extensions
功能创建的配置文件,Extensions
是一种添加库到Core Classloader
的方式,Maven
主要有四类System Classloader -> Core Classloader -> Plugin Classloaders -> Custom Classloaders
因为CloassLoader
都是双亲委派模式,因此添加到Core Classloader
中的库能够在Plugin Classloaders
和Custom Classloaders
中使用:
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
主要用于添加通用选项,在执行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参数的文件,很容易理解就很少说了。
构建生命周期
就Maven较核心的概念, Maven有三个内置的构建生命周期分别为:clean
、default
、site
。
在Maven中一个生命周期由一系列Build Phase
组成,而每一个生命周期都会有不少Build Phase
如default
生命周期由如下Build Phase
组成:
这些生命周期阶段(加上此处未显示的其余生命周期阶段)将顺序执行以完成default
生命周期。给定上面的生命周期阶段,这意味着当使用default
生命周期时,Maven将首先验证项目,而后尝试编译源代码,针对测试运行源代码,打包二进制文件(例如jar),针对该源运行集成测试软件包,验证集成测试,将通过验证的软件包安装到本地存储库,而后将已安装的软件包部署到远程存储库。
Build Phase
只是定义一些软件构建的流程,它不会直接去构建工程,这些构建流程的实施都是由插件
来作的,构建生命周期能够这样理解一个生命周期由多个构建阶段组成,每一个构建阶段都会被多个插件目标绑定,用一张图表示他们之间的关系:
图中的jar:jar
、install:install
是plugin:goal
的意思,冒号的前面部分是插件名称,后面是目标名称。由上图可知当执行mvn install
的命令时,会执行default
生命周期中的install
阶段(同时在install以前的阶段也会执行),因为install:install
目标绑定到了install phase
,因此install:install
目标也会执行,这样就经过install
插件来完成打包功能。
Maven是很是流行的构建工具,下一代构建工具Gradle
也有一些点是借鉴了Maven。文中所提到的点只是Maven工具的一部分知识,Maven还有不少强大的功能如:依赖管理、插件管理、多工程等功能,后续再整理这些高级功能与你们分享。
公众号《架构文摘》天天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性能、高稳定)、大数据、机器学习、Java架构等各个热门领域。