Maven的基本概念
[toc]
Maven可以帮助我们做什么
如果只是一个简单的项目(例如只有一个Java文件的一个主函数,也不需要依赖其他的Jar包等),就不需要使用项目构建管理工具。而在大型项目开发过程中需要非常多的步骤:build,test,deploy,publish等,并且在开发过程中也需要依赖各种外部的Jar包来提升开发效率,就需要一个对项目构建的管理工具——Maven。
Maven主要提供了以下的几个功能:
repo(仓库的管理):开发项目过程中,我们需要引入其他的Jar包,在maven中可以指定获取Jar包的仓库。
dependency(依赖管理):开发项目过程中,我们需要引入第三方的jar包(不同的版本,以及多个Jar之间的依赖),在maven中都可以解决。
lifecycle(生命周期管理):在maven的构建中被划分为多个阶段(生命周期),构建的过程也是按照生命周期进行执行。
Maven的安装
Mac或者Linux上安装
- 下载Mavne binary 包
wget https://mirrors.ocf.berkeley.edu/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
- 解压
tar -xvzf apache-maven-3.6.3-bin.tar.gz
mvn apache-maven-3.6.3-bin.tar.gz maven
- 修改PATH变量
cd maven/bin
export PATH=$PATH:`pwd`
或者将对应的maven bin添加到 ~/.bashrc中,例如添加如下内容
MAVEN_HOME=your maven home
PATH=$PATH:$MAVEN_HOME/bin
export PATH
- 测试mvn是否正常执行
mvn --version
如果产生如下的内容,表示安装成功
使用Maven构建一个项目
- 创建maven项目
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
进入到my-app项目以后会发现一个pom.xml
的文件,maven项目的整个构建过程都是通过这个文件进行管理和控制的。由于pom.xml
文件非常复杂,当前阶段不需要全部理解,仅仅需要知道一些主要的内容和模块,后期在使用其他功能的时候再进行详细的补充与介绍。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
上述xml文件中,包含了pom的最基本的内容:
- groupid:项目归属的组织
- artifactid:工程项目的名字
- version:表示项目的版本
- dependencies:项目依赖的jar包
更加深层次的pom介绍可以参考Introduction to the POM。
- build项目
在my-app目录下执行mvn package
命令,可以将项目进行build,产生对应的Jar包。
创建maven项目和构建maven项目分别使用了maven中的两个概念:goal和phase,其中mvn archetype:generate
表示执行了maven中的一个goal;mvn package
表示执行maven中的一个phase。
下面将详细介绍goal和phase的概念。
Maven的几个核心概念
生命周期(phase):maven将构建项目的过程进行了抽象,抽象出来了一个过程,这个过程被称作生命周期(lifecycle)。lifecycle是有多个有序的阶段(phase)构成的。
阶段(phase):maven将lifecycle划分为多个有序的过程(step),每一个过程被称作一个阶段(phase)。
目标(goal):goal在maven中是真正执行任务的单元,goal的提供者是插件(plugin),每一个plugin可能提供多个goals。例如 mvn compiler:compile
表示了一个goal,其提供者是插件 compiler
。compiler
其实是这个插件的缩写,其完整的插件名字为org.apache.maven.plugins:maven-compiler-plugin
,compile
仅仅是这个一个插件中的一个goal。
三者之间的管理:goal是一个执行任务的最小单元,每一个goal都是由其对应的plugin提供的;可以将对应的goal绑定到某个phase上,当在进行maven构建的过程中只要执行到了对应的phase上,就可以在当前phase上完成goal的执行。