32

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

 5 years ago
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.
neoserver,ios ssh client

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

R7NzuyJ.png!web

这篇文件主要简单介绍一些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 的配置项非常多,就不详细说明了可以查看官方文档。

UfuEJbF.png!web

.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 中使用:

nM7fIrB.png!web

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

JV77zeJ.png!web

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

总结

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

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

yaINviQ.jpg!web


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK