

开局一张图,学一学项目管理神器Maven!
source link: http://www.cnblogs.com/xwgblog/p/12058261.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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了:
- 下载 apache-maven-3.6.3-bin.zip
- 使用
unzip
命令解压apache-maven-3.6.3-bin.zip
压缩文件 - 添加一个
MAVEN_HOME
环境变量,指向解压后的apache-maven-3.6.3-bin
目录 - 将
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
命令的基本样式由 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 有三个可以修改配置的地方:
-
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_HOME
和 USER_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 Classloaders
和 Custom 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有三个内置的构建生命周期分别为: clean
、 default
、 site
。
构建阶段(Build Phase)
在Maven中 一个生命周期由一系列 Build Phase
组成 ,而每个生命周期都会有很多 Build Phase
如 default
生命周期由以下 Build Phase
组成:
- validate -确认项目正确并且所有必要的信息均可用
- compile -编译项目的源代码
- test-使用合适的单元测试框架测试编译后的源代码。这些测试不应要求将代码打包或部署
- package -获取编译后的代码,并将其打包为可分发的格式,例如JAR。
- verify -对集成测试的结果进行任何检查,以确保符合质量标准
- install -将软件包安装到本地存储库中,以作为本地其他项目中的依赖项
- deploy -在构建环境中完成后,将最终软件包复制到远程存储库中,以便与其他开发人员和项目共享。
这些生命周期阶段(加上此处未显示的其他生命周期阶段)将顺序执行以完成 default
生命周期。给定上面的生命周期阶段,这意味着当使用 default
生命周期时,Maven将首先验证项目,然后尝试编译源代码,针对测试运行源代码,打包二进制文件(例如jar),针对该源运行集成测试软件包,验证集成测试,将经过验证的软件包安装到本地存储库,然后将已安装的软件包部署到远程存储库。
插件目标(Plugin Goals)
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架构等各个热门领域。
Recommend
-
132
context简单概述: Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,该请求上的所有goroutines应该退出,防止资源泄露。那么context来了,它对该请求上的所有goroutines进行约束,然后进...
-
37
用户研究在日益注重用户体验的今天也在越来越被公司所注重。用户研究在于通过一定方式对用户进行洞察,给出相关建议方案,从而帮助产品更好的设...
-
16
Maven强大的Java工程构建工具,做Java开发时少了跟Maven打交道,之前在知乎上看到有人提问:“学Java开发需不需要学习Maven?”,个人认为是必需要学的,这和工欲善其事必先利其器是一个道理,开发软件也要先把工具学好才能事半功倍啊。所以最近花了一点时间,将Maven...
-
11
一学就会的git命令 ...
-
10
【隐写】开局一张图,啥也看不出 - 合天智汇 - OSCHINA - 中文开源技术交流社区 ...
-
14
入行产品,如何避免:一学就会,一用就废? | 运营派 ¥1 ¥99 ...
-
5
顺序表概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可分为: 静态顺序表:使用定长数组存储元素动...
-
9
假设,我们有这样一张 Gif 图: 利用 CSS,我们尝试来搞一些...
-
7
V2EX › 问与答 项目管理问题,老哥们是 gradle 用的多还是 maven 用的多
-
9
chatgpt OpenAI 多模态 AI 模型 GPT-4 开局一张图内容全靠编 聊天机器人 ChatGPT 开发商 OpenAI 14 日发表最新人工智能模型 GPT-4,更可靠、更...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK