3.3.1 Maven简介
Apache Maven是一款软件项目管理的开源工具,是基于工程对象模型(Pom)的概念而设计的。 Maven可以管理项目构建的整个生命周期,包括清理( Clean)、编译( Compile)、打包( Package)、测试(Test)等环节。同时 Maven提供了非常丰富的插件,使得构建项目和管理项目变得简单。构建一个项目所需要的流程如下
(1)生成源码
(2)从源码中生成文档。
(3)编译源码
(4)测试
(5)将源码打包成Jar,运行在服务器、仓库或者其他位置。
Apache Maven已经实现了以上的全部功能,并且只需要相关的命令就可以完成相关的功能
3.3.2 Maven的安装
安装 Maven前,需要保证JDK已经正确安装,并且环境变量已经配置正确, Maven版本为3.0之后的液木,需要的DK版车至少为1.6版本。
从官网http://maven.apche.org/download.cgi下载完Apache Maven,解压到任意目录,例如我解压到D:\MyTools\apache-maven-3.3.9下:
配置环境变量,如图
添加到Path
检查Maven是否安装成功和Maven的环境变量是否配置正确,可以使用Maven命令“mvn -v”去检查。打开命令管理器,输入“mvn -v”,如果显示如下信息,则证明Maven安装成功且环境变量配置正确。
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\MyTools\apache-maven-3.3.9\bin\..
Java version: 1.8.0_71, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_71\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
设置Maven的本地仓库,在终端输入命令切换到Maven配置文件的目录,打开Maven的配置文件settings.xml。
打开配置文件settings.xml后,在配置文件中修改本地仓库的路径,本案例的本地仓库路径为D:/EAWorkspace/mavenRepositories,配置如下:
<localRepository>D:/EAWorkspace/mavenRepositories</localRepository>
早于Maven远程服务器在国外,可以添加阿里云的镜像,这样下载Jar包的速度会大大增加,在配置文件settings.xml下添加如下内容:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
3.3.3 Maven的核心概念
Maven的核心是pom文件,pom文件以xml文件的形式来表示资源,包括一些依赖Jar、插件、构建文件等。Maven的工作过程如下:
- 首先读取pom文件。pom文件是Maven的核心,所有的项目依赖、插件都在pom文件中统一管理。
- 下载依赖Jar到本地仓库。Maven命令执行时,首先会检查pom文件的依赖Jar,当检测到本地没有安装Jar时,会默认从Maven的中央仓库下载依赖Jar,中央仓库地址为“http://repol.maven.org/maven2/”。 依赖Jar下载成功后,会存放在本地仓库中,如果下载不成功,则该命令执行不会通过。
- 执行构建的生命周期。Maven的构建过程会被分解成构建阶段和构建目标,它们共同构成了Maven的生命周期。
- 执行构建插件。插件可以更方便地执行构建的各个阶段,也可以用插件实现一些额外的功能。目前Maven有非常丰富的插件,如果需要,你也可以自己实现Maven插件。
3.3.4 编写Pom文件
pom文件是一个xml文件,用于描述项目用到的资源、项目依赖、插件、代码位置等信息,是整个工程的核心。pom.xml文件一般放在项目的根目录下。以3.2.1节案例中工程的pom文件为例来讲解,其代码如下:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.21.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.forezp</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-world</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
pom. xml的第一行指定了xml的版本和编码方式。 project的标签是该文件的根元素,它声明了pom相关的命名空间。 model version指定了pom的版本,对于Maven3来说,它的版本为4.0.0。
groupId、 artifactId和 version是3个最重要的标签,根据这3个标签,可以在 Maven仓库中唯一确定该依赖Jar。其中, groupId代表了公司、组织的名称,一般为公司域名的倒写,如本例中的 com. forezp; artifactId代表该项目的全局唯一ld,如本例中的helo- world; version是指该项目的版本。将项目上传到 Maven仓库中,有这3个标签才能准确无误地找到该Jar包。
parent标签用于指定父pom,本案例采用的父pom是版本号为1.5.21 RELEASE的
spring-boot-starter-parent 的 pom。
properties标签用于声明一些常量,例如上述代码中的Java版本为1.8。
dependencies标签为依赖的根元素,里面可以包含多个 dependency元素, dependency里具体为各个依赖Jar的3个坐标,即 groupId、 artifactId和 version。其中 version可以缺省,如果缺省,就会默认为最新发布的版本。
build为构建标签,它可以包含 plugins(插件)标签, plugins标签中可以包含若干个 plugin标签,可以根据项目的需求添加相应的 plugin。本例中有 spring-boot-maven-plugin插件,用此插件可以启动 Spring Boot工程。
3.3.5 Maven构建项目的生命周期
在 Maven工程中,已经默认定义了构建工程的生命周期,不需要额外引用其他的插件,
因为 Maven本身就已经集成了这些插件。默认的生命周期包括了23个阶段,如表所示。
阶段 | 描述 |
---|---|
validate | 验证工程的完整性 |
initialize | 初始化 |
generate-sources | 生成源码 |
process-sources | 处理源码 |
generate-resources | 生成所有源码 |
process-resources | 处理所有源码 |
compile | 编译 |
process-classes | 处理class文件 |
generate-test-sources | 生成测试源码 |
process-test-sources | 处理测试源码 |
generate-test-resources | 生成所有测试源码 |
process-test-resources | 处理所有测试源码 |
test-compile | 测试编译 |
process-test-classes | 处理测试class文件 |
test | 测试 |
prepare-package | 预打包 |
package | 打包(如Jar、War) |
pre-integration-test | 预集成测试 |
integration-test | 集成测试 |
post-integration-test | 完成集成测试 |
verify | 验证 |
install | 安装到本地仓库 |
deploy | 提交到远程仓库 |
3.3.6 常用的Maven命令
(1)mvn clean 删除工程的target 目录下的所有文件
(2)mvn package将工程打包为Jar包。
在终端上切换到3.2.1节中项目的要目录下,输入mvn package命令,终端最后会显示如下信息,证明工程打包Jar包成功
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ hello-world ---
[INFO] Building jar: D:\IDEAspace\hello-world\target\hello-world-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.5.21.RELEASE:repackage (default) @ hello-world ---
Downloading: http://172.29.12.46:8081/nexus/content/groups/public/org/springframework/boot/spring-boot-loader-tools/1.5.21.RELEASE/spring-boot-loader-tools-1.5.21.RELEASE.pom
Downloaded: http://172.29.12.46:8081/nexus/content/groups/public/org/springframework/boot/spring-boot-loader-tools/1.5.21.RELEASE/spring-boot-loader-tools-1.5.21.RELEASE.pom (4 KB at 7.1 KB/sec)
Downloading: http://172.29.12.46:8081/nexus/content/groups/public/org/springframework/boot/spring-boot-loader-tools/1.5.21.RELEASE/spring-boot-loader-tools-1.5.21.RELEASE.jar
Downloaded: http://172.29.12.46:8081/nexus/content/groups/public/org/springframework/boot/spring-boot-loader-tools/1.5.21.RELEASE/spring-boot-loader-tools-1.5.21.RELEASE.jar (150 KB at 92.0 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 43.267 s
[INFO] Finished at: 2019-05-28T11:05:41+08:00
[INFO] Final Memory: 29M/85M
[INFO] ------------------------------------------------------------------------
上述的mvc package命令不是一个简单的命令,它是由一系列有序的命令构成的,mvc package命令执行过程包含以下6个阶段。
- 验证。
- 编译代码。
- 处理代码。
- 生成资源文件。
- 生成Jar包。
- 测试。
(3)mvn pacckage -Dmaven.test.skip=true,打包时跳过测试。
(4)mvn compile编译工程代码,不生成Jar包。
(5)mvn install命令包含了mvn package的所有过程,并且将生成的Jar包安装到本地仓库。执行mvn install命令,可以看到终端输出的日志,经过了与mvn package相同的阶段,最后将Jar包安装到本地仓库。
(6)mvn spring-boot:run使用spring-boot插件,启动Spring Boot工程。该命令执行时先检查Spring Boot工程源码是否编译,如果工程源码没有编译,则先编译;如果编译了;则启动工程,启动后工程日志如下:
[INFO] --- spring-boot-maven-plugin:1.5.21.RELEASE:run (default-cli) @ hello-world ---
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.21.RELEASE)
2019-05-28 11:13:52.097 INFO 30164 --- [ main] c.f.helloworld.HelloWorldApplication : Started HelloWorldApplication in 4.219 seconds (JVM running for 9.417)
(7)mvn test 测试。
(8)mvn idea:idea 生成 idea项目。
(9)mvn jar:jar 只打Jar包。
(10)mvn validate 检验资源是否可用。
本章讲述了开发项目中开发环境的搭建和开发工具的使用,难免会有点枯燥,但却是开发微服务的基本前提,下一章将讲述Spring Boot的入门内容。