Maven入门实战总结
一. 概要说明
Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。它的主要功能有:
- 提供了一套标准化的项目结构。
- 提供了一套标准化的构建流程(编译,测试,打包,发布……)。
- 提供了一套依赖管理机制。
二. 项目结构
2.1 目录结构
一个使用 Maven 管理的普通的 Java 项目,它的目录结构默认如下,这些就是一个Maven 项目的标准目录结构。
netflow
|── pom.xml
|── src
| ├── main
| │ └── java
| │ └── com
| │ └── yuchaoshui
| │ └── App.java
| └── test
| └── java
| └── com
| └── yuchaoshui
| └── AppTest.java
└── target
项目的根目录netflow是项目名
- 它有一个项目描述文件 pom.xml
- 存放Java源码的目录是 src/main/java
- 存放资源文件的目录是 src/main/resources
- 存放测试源码的目录是 src/test/java
- 存放测试资源的目录是 src/test/resources
- 所有编译、打包生成的文件都放在 target目录里。
2.2 命令行创建项目
mvn archetype:generate \
-DgroupId=com.yuchaoshui \
-DartifactId=netflow \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
2.3 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.yuchaoshui</groupId>
<artifactId>project-name</artifactId>
<version>1.0</version>
<properties>
...
</properties>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
...
</dependencies>
<build>
<plugins>
...
</plugins>
</build>
</project>
其中,groupId类似于Java的包名,通常是公司或组织名称,artifactId类似于Java的类名,通常是项目名称,再加上version,一个Maven工程就是由groupId,artifactId
和version
作为唯一标识。我们在引用其他第三方库的时候,也是通过这 3 个变量确定。
2.4 mvn命令打包
打包。下面的命令表示先清除之前的打包内容,重新到一个新的包。这也是最常用的打包命令。
mvn clean package
三. 依赖关系
Maven 定义了几种依赖关系,分别是compile、test、runtime、provided、system。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.5</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</exclusion>
</exclusions>
</dependency>
scope | 说明 | 示例 |
---|---|---|
compile | 编译时需要用到该jar包(默认) | commons-logging |
test | 编译Test时需要用到该jar包 | junit |
runtime | 编译时不需要,但运行时需要用到 | mysql |
provided | 编译时需要用到,但运行时由JDK或某个服务器提供 | servlet-api |
system | 和provided相同,不同的是system需要自己指定jar包路径 |
- Maven 维护了一个中央仓库 repo1.maven.org,所有第三方库将自身的 jar 以及相关信息上传至中央仓库,Maven 就可以从中央仓库把所需依赖下载到本地。
- Maven 并不会每次都从中央仓库下载jar包。一个 jar 包一旦被下载过,就会被Maven 自动缓存在本地目录(用户主目录的 .m2 目录),所以,除了第一次编译时因为下载需要时间会比较慢,后续过程因为有本地缓存,并不会重复下载相同的jar包。
- 注:只要包含了 SNAPSHOT 的版本号会被 Maven 视为开发版本,开发版本每次都会重复下载,这种 SNAPSHOT 版本只能用于内部私有的 Maven repo,公开发布的版本不允许出现 SNAPSHOT。
四. Maven镜像
除了可以从Maven的中央仓库下载外,还可以从Maven的镜像仓库下载。如果访问Maven的中央仓库非常慢,我们可以选择一个速度较快的Maven的镜像仓库。Maven镜像仓库定期从中央仓库同步。比如使用阿里云提供的Maven镜像仓库,使用Maven镜像仓库需要一个配置,在用户主目录下进入.m2目录,创建一个settings.xml配置文件,内容如下:
cat ~/.m2/settings.xml
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<mirrorOf>*</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
五. 构建流程
Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。Maven的生命周期(Lifecycle)由一系列阶段(Phase)构成,
5.1 默认生命周期default
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
如果我们运行mvn package
,Maven就会执行default
生命周期,它会从开始一直运行到package
这个phase为止:
- validate
... - package
如果我们运行mvn compile
,Maven也会执行default
生命周期,但这次它只会运行到compile
,即以下几个phase:
- validate
... - compile
5.2 常用生命周期clean
生命周期是clean会执行3个phase:
- pre-clean
- clean (注意这个clean不是lifecycle而是phase)
- post-clean
5.3 常用命令总结
mvn clean
:清理所有生成的class和jar(通常是target目录);mvn clean compile
:先清理,再执行到compile;mvn clean test
:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile;mvn clean package
:先清理,再执行到package。mvn install
: 在本地 Repository 中安装 jar