开局一张图,学一学项目管理神器Maven

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 (cecedd343002696d0abb 50b32b541b8a6ba2883f)
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.xmlmaven.configjvm.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还有很多强大的功能如:依赖管理、插件管理、多工程等功能,后续再整理这些高级功能与大家分享。

原文地址:https://blog.51cto.com/14528283/2459672

时间: 2024-10-09 07:22:57

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

迁移上云|开局一张图,技能靠爬坑

迁移上云|开局一张图,技能靠爬坑 个人经历过两家公司从0到1上云,迁移和直接上云,记录一些爬”坑“趣事 上云流程+云端网络.应用结构 迁移上云流程+结构图 流程 结构 为啥上云 当然每个公司面对的问题不同,我只能从自身经历的两家公司和自身的一些认知来说,欢迎同学补充. 假设你们是自建机房(IDC就不讨论了),你想想中你们的机房是这样的 但是也有可能是这样式的 有点夸张哈,但是实际自己机房什么样,谁进谁知道 进入正题 机房图片只是调皮一下,真实上云的话考虑无非几点,上云是否可以解决你的关键性问题,

一张图学dockerfile

一张图就能学会Dockerfile Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image.这比SaltStack的配置管理要简单的多,不过还是要掌握一些简单的指令. Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行.指令是不区分大小写的,但是通常我们都大写. 下面我们通过构建一个Ngin

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

很多参加PMP培训的学员大概都会有一个感受,上课时似乎每个知识点都听懂了,大的知识框架也弄明白了,但是所有这些串起来在实践中怎么用呀!说的再直接一点,在考试的时候这些过程和活动是以怎样的逻辑来应用的.不用捉急,看完下面这张图,您就清楚了. (1)注意启动那一栏中的"理解商业论证",要理解成为"理解项目的商业论证"(商业论证是项目立项的原因),因为商业论证将指导项目的所有活动,以确保在项目结束的时候来所有的投资都是值得的.对于商业论证的重要性,很多考生在考试中都不太注

【算法】7 一张图体会栈和队列

栈和队列 学过没学过算法的应该都听过栈和队列了吧,往往容易弄混的就是"后进先出"和"先进先出"了. 今天又看到了"河内塔"的相关资料,也被称为"汉诺塔"等.于是就想到了画出下面这样的图案. 如果大家觉得这张图不错可以直接右键另存为哦,记得点赞哈~ 那么,关于栈和队列下面就直接列出相关操作的伪代码咯. 栈 STACK-EMPTY(S) 1 if S.top==0 2 return TRUE 3 else 4 return FLA

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

前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试Nodejs>之后,代码编写环境就从Sublime转战到Eclipse下,感觉顺手多了.于是就跟着Scott老师学起了Nodejs建站的课程(推荐大家点进去看看),踏上了未爬先走的路子. 作为一个白里透白的小白来说,今天主要记录下如何用Nodejs搭建一个小小的网站,以及自己对于这种Nodejs建站的运

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

前言 学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把. 今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点.所谓不求最好,但求最全,学习Java后端的同学完全可以参考这张图进行学习路线安排. 当然,有一些知识点是可选的,并不是说上面有的你都要会啦.我在复习秋招的过程中就是基于此图进行复习的,感觉效果还是不错的. 闲言少叙,我们还是看看这张图上都包含哪些有价值的信息吧.再次说明,本文只对路线图做一个简单地解读,仅供参考.大家可以根据自身情况来指定合理的

学一学MVC的过滤器--异常处理

学习MVC不久,看到公司的项目里有日志记录功能,出于自己的原因一直没有看看是如何实现的,后来看了个学习视频和一些博文,才发现采用MVC里的过滤器 Filter 可以很容易实现,比较常见也很容易的做法就是继承  IActionFilter,IExceptionFilter 接口,然后实现里面的方法即可. 下面看一下代码,这是公司项目的一段代码,主要是将项目中出现的异常记录在 每天的txt日志文件里.当然实现日志的方法有很多种,这个只是其中一种,如果出现了IO错误,这种方法就不好说啦.  publi

一张图说明环境变量

为了搞懂环境变量,做了一个小实验,体会到环境变量到底是什么样子的. [[email protected] ~]# cat 1.sh #!/bin/bash echo $n [[email protected] ~]# cat 22.sh #!/bin/bash export n=98 /root/1.sh 我在22.sh文件中定义了环境变量n,并且执行1.sh文件.在1.sh文件中执行echo $n  .然后我给两个文件都加上x权限,执行22.sh,我们将会得到什么呢? [[email prot

一张图看懂ANSYS17.0 流体 新功能与改进

一张图看懂ANSYS17.0 流体 新功能与改进 提交 我的留言 加载中 已留言 一张图看懂ANSYS17.0 流体 新功能与改进 原创2016-02-03ANSYS模拟在线模拟在线 模拟在线 微信号sim_ol 功能介绍这是数值模拟.仿真分析领域最大的公众号,没有之一!!! 点上方“模拟在线”查看更多“牛B”资讯! 感谢ANSYS公司对平台的友情支持,本次17.0的改进报告均为ANSYS提供(授权直接摘抄,确实给小编省事不少啊).本次首先带来是流体方面的改进和优化.后续陆续推送结构.电磁等各方