Maven 项目管理工具
1. Maven 简介
a. Maven 是什么?
- Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。
- 对 Maven 比较正式的定义:Maven 是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的工具。
b. Maven 能解决什么问题?
- 可以用更通俗的方式来说明。我们知道,项目开发不仅仅是写写代码而已,期间会伴随着各种必不可少的事情要做,下面列举几个例子:
- 我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个,每用到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。
- 我们写好的 java 文件,需要通过 javac 编译成 class 文件才能交给 JVM 运行。这项工作可以由各种 集成开发工具 帮我们完成 Eclipse、IDEA 等都可以将代码即时编译。
- 世界上没有不存在 bug 的代码,因此写完了代码,我们还要写一些单元测试,然后 逐一 运行来检验代码质量。
- 再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,进行 打包。如果是 web 项目,还需要将之发布到服务器 。
- 试想,如果现在有一种工具,可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站点,你会心动吗?Maven 就可以解决上面所提到的这些问题。
c. Maven 的两个核心功能(重点)
i. 依赖管理
- 传统的 WEB 工程中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。
- Maven 的 WEB 工程中不直接将jar包导入到工程中,而是通过在 pom.xml 文件中添加所需jar包的坐标。项目运行时,通过读取坐标到一个专门用于“存放jar包仓库"(Maven仓库)找到相应的jar包。
- 仓库如何存放 jar 包?
ii. 项目构建
- 我们开发的项目,往往都要经历编译、测试、打包、安装,部署等一系列过程。
- 什么是构建项目?
指的是项目从编译、测试、打包、安装,部署整个过程都交给 ?Maven 进行管理,这个过程称为构建。 - 一键构建
指的是整个构建过程,使用 Maven 一个命令可以轻松完成整个工作。
2. Maven 安装和使用
a. Maven 下载和安装
- 下载
Maven 官网下载地址 :http://maven.apache.org/download.cgi
Maven 3.3+ 必须要求 JDK 1.7+ - 安装
Maven 使用 java 语言开发的,解压即可运行
注意:Maven 依赖 JAVA_HOME - 目录
bin:存放了 Maven 的命令,比如我们前面用到的 mvn tomcat7:run
boot:存放了一些 Maven 本身的引导程序,如类加载器等
conf:存放了 Maven 的一些配置文件,如 setting.xml 文件
lib:存放了 Maven 本身运行所需的一些 jar 包
- 环境变量
MAVEN_HOME
:Maven 安装目录
path
:%MAVEN_HOME%\bin
- 配置完毕后检查版本
mvn --version
b. Maven仓库(重点)
i. Maven 仓库的分类
- 本地仓库
项目通过 jar 坐标,先从本地仓库找对应 jar 包,如果找不到会从远程仓库(互联网)去下载 jar 包,保存在本地仓库(在程序员的电脑上),第二次不需要从远程仓库去下载。 - 远程仓库
- 中央仓库
由专业团队(Maven 团队)统一维护。
中央仓库的地址:http://repo1.maven.org/maven2/ - 私服
架设在公司局域网内,提供给内部的人员使用。 - 第三方仓库
中央仓库只有一个,国内使用非常慢,我们可以更换为:阿里云镜像。
- 中央仓库
ii. Maven 本地仓库的配置
- 将 repository.zip 解压到非中文及特殊符号目录下
(Maven 仓库)
- 修改 Maven 的安装目录 /conf/settings.xml 文件的标签
<localRepository>本地仓库地址</localRepository>
(指定自定义本地仓库)
iii. Maven 仓库国内镜像配置
- 修改 Maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
c. Maven 坐标和依赖
- 想要只用哪个 jar 包,通过坐标方式进行依赖引入。
d. Maven 工程的结构(重点)
- 传统的 java 工程遇到的问题:
* java项目
java工程名(项目名)
|-- src目录
|-- main目录(主干代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- test目录(测试代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目录(存放编译后的class文件,没有test目录下的编译文件)
* web项目(重点)
web工程名(项目名)
|-- src目录
|-- main目录(主干代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- webapp目录(页面资源)
|-- WEB-INF
|-- web.xml(web工程核心配置文件)
|-- index.jsp
|-- css、js、img..
|-- test目录(测试代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目录(存放编译后的class文件,没有test目录下的编译文件)
3. Maven 生命周期和插件(了解)
a. Maven 常用命令和插件
- 可以在 cmd 中通过一系列的 Maven 命令,来对我们的工程进行编译、测试、打包、安装、部署。
i. clean
- Maven 工程的清理命令,执行 clean 会删除 target 目录及内容(之前的 out 目录)。
mvn clean
ii. compile
- Maven 工程的编译命令,作用是将 src/main/.java 下的文件编译为 class 文件,并和 src/main 目录下的配置文件一起输出到 target/classes 目录下。
mvn compile
iii. test
- Maven 工程的测试命令,作用是执行 src/test/java 下单元测试类,并编译为 class 文件。
mvn clean test
先清理再测试
iv. package
- Maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war 包。 会自动进行测试,测试成功就打包,不成功不打包。
mvn clean package
先清理再打包
注意:为什么 maven_hello 是 war 包而不是 jar 包呢?
v. install
- Maven 工程的安装命令,执行 install 将 mave 工程打成 jar 包或 war 包,并发布到本地仓库。也是先编译主干再测试,需要添加依赖。
mvn clean install
先清理再安装
vi. deploy
- Maven 工程部署命令,将 jar 或 war 包部署(上传)到私服中。
- Maven 高级介绍了这个命令。
b. 生命周期
- Maven 对项目构建过程分为 “三套相互独立的” 生命周期,这三套生命周期分别是:
- Clean Lifecycle(清理生命周期)
在进行真正的构建之前进行一些清理工作。
命令:clean - Default Lifecycle(默认生命周期)
构建的核心部分,编译,测试,打包,部署等等。
命令:compile test package install deploy - Site Lifecycle(站点生命周期)
生成项目报告,站点,发布站点。
命令:site
- 在同一个生命周期中的命令,执行后面的命令,前面的命令自动执行
c. Maven 概念模型(了解)
4. IDEA 创建 Maven 工程(重点)
a. IDEA 配置本地 Maven 环境(全局)
- 我们在 IDEA 创建 Maven 工程默认从互联网在下载一个骨架(但是我们电脑没有联网,就会卡顿一段时间,再使用本地骨架),我们可以直接指定 IDEA 查找本地骨架,提升效率并指定编码防止乱码。
-DarchetypeCatalog=internal -Dfile.encoding=GB2312
- 需要创建一个全新的工作空间(基于 Mave 结构),注意要遵守 IDEA 初始化工作空间规范。
b. IDEA 创建工程
i. Java 工程
- 手动创建 test 测试配置文件目录:
- 指定 Maven 环境的 JDK 版本和字符集:
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
- Maven 工程命令操作:
- 如何导入依赖?
- Maven 的搜索仓库:https://mvnrepository.com/
<!--依赖管理-->
<dependencies>
<!--junit坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
ii. web 工程(重点)
- IDEA 创建 web 工程,需要我们安装一个插件:
- 安装成功后,重启 IDEA 工具
iii. 注意
- 创建完 Maven 之后,如果文件夹不会变颜色,可以手动刷新:
c. 发布 web 工程
i. IDEA 使用外置 Tomcat 运行(重点)
- 点击 Add Configuration:
- 测试:
ii. IDEA 使用 Maven 内置 Tomcat 插件(了解)
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
- 双击启动(推荐):
- 命令启动(不推荐,取消会默认退回到之前的 Module):
d. 依赖管理
- 开发期间,jar 包都在仓库;运行期间,Maven 自动把 jar 包放到了项目的 lib 目录下。
- 不考虑依赖范围引起的问题:
- clean package 之后,javax.servlet-api.jar 包消失了。
依赖范围 | 对于编译 classpath 有效 | 对于测试 classpath 有效 | 对于运行时classpath 有效 | 例子 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | mybatis |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地,maven仓库之外的库 |
- compile
默认依赖范围,作用域在编译、测试、运行时都有效。 - test
作用域在测试时有效。编译和运行时不需要,比如:Junit。 - provided
作用域在编译、测试时有效。运行时不需要,比如: servlet api 被 tomcat 容器提供,不指定可能会因为版本不兼容导致冲突。 - runtime
作用域在测试、运行时有效。编译时不需要,比如:jdbc 的驱动包。 - system
system 范围依赖与 provided 类似,jar 包在本地磁盘而不是 Maven 仓库。相当于找到 WEB-INF/lib,自己导入 jar 包,一般是因为在 Maven 仓库(本地、官网)里没有该 jar 包,不过一般很少出现该情况。