第一节 Maven入门
1.1 什么是Maven
- Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
- Maven是跨平台的项目管理工具,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
- 相当于iOS cocoapods
- Maven的好处:
- 方便jar的管理
- 不需要上传jar包到svn
- 以后项目中要使用jar包可以使用Maven来管理(jar包不在项目中,在Maven仓库),只需要引入Maven依赖(jar包坐标),使得多个项目只需要使用一套jar即可(节省磁盘空间),项目完成后使用Maven命令将(web)项目打成war包也会把项目所需的jar包含进去。
- 而且jar包的版本问题也容易解决,修改依赖即可
1.2 如何使用Maven
第一步:下载Maven
- Maven无需安装,下载后解压即可
- Maven下载地址:https://archive.apache.org/dist/maven/maven-3/.
- 这里使用的是3.5.0版本,也可以使用最新的3.6.3
- .tar.gz是linux系统和macOS下使用
- 解压到自己想要放的位置
第二步:配置Maven的环境变量
- 配置环境变量的目的是为了在dos中快捷、方便的使用Maven的一些命令
- 右键此电脑->属性->高级系统设置->高级->环境变量
- 在系统变量中新建MAVEN_HOME
- 系统变量中的选中Path,编辑
- 配置完成后一路确定即可
- (Win+R)输入cmd,打开终端,在里面输入 mvn -v(或mvn -verison),类似如下画面即Maven环境变量配置成功
第三步:了解什么是Maven仓库
- Maven本地仓库:一般用户只会为自己配置一个本地仓库
- Maven本地仓库是用来干啥的?
其实就是用来存放网上下载到本地的jar包。 - Maven本地仓库的路径默认情况下是在用户目录下 C:\User\xxx\.m2\repository 可修改
- Maven本地仓库是用来干啥的?
- Maven远程仓库【私服】
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库,nexus就是用来创建maven的私服的,也就是提高依赖的下载速度,用阿里云的私服就好(一般公司有自己的私服) - Maven中央仓库
Maven默认的远程仓库,不包含版权资源,存放了几乎所有的开源jar(但是一般中央仓库的地址下载都比较慢,使用国内阿里云的中央仓库即可)
第四步:修改setting.xml配置文件
- 配置本地的Maven仓库路径,在Maven解压文件目录下的conf/settings.xml中修改
- 查看setting.xml配置文件,看到Default:(默认)是在用户目录下的.m2\repository中
- 复制下面一行,添加本地存放路径(这样配置后,默认配置将不再生效,jar包将存放在设置的路径下,找本地jar的时候,也先在这里面找)
<localRepository>D:\Maven_localRepository</localRepository>
- 继续往下看,maven默认会从上面的服务器(中央仓库) 下载 jar包到本地,由于是国外的服务器,下载jar的速度相对来说会很慢,不使用它,使用国内比较好的阿里云服务器下载jar,速度会快不少
<mirror>
<id>aliyun</id>
<mirrorOf>aliyun</mirrorOf>
<name>aliyun Maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
- 打开终端,输入 mvn help:system 回车执行(出现以下页面就表示下载完成)
- (mvn help:system执行Maven的帮助系统下载一些基本的jar和插件)
1.3 Maven的项目结构
- 普通maven java项目的结构
ProjectName
|-src
| |-main
| | |-java —— 核心代码部分.java
| | |-resources —— 配置文件部分(spring、hibernate、mybatis、struts2等)
| |-test
| |-java —— 存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源配置文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml —— maven项目核心配置文件
- maven javaWeb项目的结构(多了一个webapp存储页面资源)
ProjectName
|-src
| |-main
| | |-java —— 核心代码部分.java
| | |-resources —— 配置文件部分(spring、hibernate、mybatis、struts2等)
| | |-webapp —— 页面资源、js、css、图片等
| |-test
| |-java —— 存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源配置文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml —— maven项目核心配置文件
- maven打包时会自动除去test包(测试)下的文件和资源,减轻项目大小。
1.4 在intellij idea中创建一个简单的javaMaven项目
- finish后,如果是第一次创建要等待一段时间,下载相关jar包
- 如果有报错,可以在本地仓库中删除报错的对应的插件,再刷新一下
- 其它设置
- 再为创建新项目时设置配置,否则每次创建项目都要重新配置很麻烦
- 设置先加载本地插件(每次创建项目都去中央仓库下载插件会很慢,设置先加载本地仓库)
- (-DarchetypeCatalog=internal)
- 创建好的项目缺少一个resources目录,有需要可自行补上
1.5 Maven的常用命令
- 写一个简单的例子用于命令的使用
- 直接写@Test会报错,Alt+Enter导入,pom.xml中的依赖会自动加上(在main下写的test不要修改scope为test)
- 可以选择右侧的Maven,执行相关操作(点击即可直接执行)
- 除了上面的简便操作外,下面在终端中也可以使用这些命令(要进入项目目录中使用命令 )
mvn compile
- 完成编译操作
- 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
- 双击compile同效果
mvn clean
- 执行完毕后,会将target目录删除。
- 双击clean同效果
- clean后无target目录
mvn test
- 完成单元测试操作
- 执行完毕后,会在target目录中生成:surefire-reports(测试报告)、test-classes(测试的字节码文件)
mvn package
- 完成打包操作
- 执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war
- 普通项目.jar,web项目.war
- 打开jar会发现,只会保存上面main下的文件,test下的将不会进入打包的文件中(由于我这里是直接写在了main的java下,也就直接看到了,可自行测试)
- 同样双击package即可
mvn install
- 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作
- 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用
- 双击install,同样效果
- 可在本地仓库中找到,方便其它项目引用
mvn 组合命令
- mvn clean compile(先清除再编译)
- mvn clean test(先清除再测试)
- mvn clean package(先清除再打包)
- mvn clean install(先清除再安装)
- 终端中直接输入即可,intellij idea中也提供了
1.6 一个项目引用另一个项目
- 使用骨架(模板)创建一个普通的Mavenjava项目
- 使用模板创建的普通javaMaven项目少2个resources目录
- 写一个简单的test,运行一下,然后将它install安装到本地
- 在项目中新建一个Module,也使用骨架创建一个Maven_java2
- 在Maven_java2中添加上一个项目的依赖(上一个项目要记得install安装到本地,否则可能找不到依赖)
- 使用
第二节 Maven的核心概念
2.1 坐标(gav)
- 在平面几何中坐标(x,y)可以标识平面中唯一的一点。
在maven中坐标就是为了定位一个唯一确定的jar包。 - Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器
- Maven坐标主要组成(GAV)确定一个jar在互联网位置
- groupId:定义当前Maven组织名称
- artifactId:定义实际项目名称
- version:定义当前项目的当前版本
2.2 坐标的查找
- 访问:http://www.mvnrepository.com.
- 或访问:https://search.maven.org/.
- 或直接百度输入maven第一个就是
- 例如要使用spring,输入sping,回车,选择所需要的jar和版本,就能看到所需要的jar的坐标了,复制进项目的pom.xml中的依赖中即可
2.3 依赖管理
scope 依赖范围
- 其中依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系。
- 主要的是三种依赖关系如下:
- compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
- test:测试依赖范围。只对于测试classpath有效。
- provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效,因为由容器已经提供。例如:servlet-api
- runtime:运行时提供。例如:jdbc驱动
依赖传递
- 直接依赖和间接依赖
- Maven_java2依赖 Maven_java,Maven_java3依赖Maven_java2
- Maven_java2直接依赖Maven_java,Maven_java3间接依赖Maven_java
- 写成test就只能在当前的test包下使用
- 2依赖1
- 3依赖2
- 范围是compile的时候,依赖可以传递
- 范围是test的时候,依赖不会得以传递(如果自己也不配置,2和3使用junit都会报错)
- 如果2中设置了junit4.12且是compile,那么3会就近依赖使用2中的junit(无关乎版本,就是就近)
可选依赖
- <optional> true/false</optional> 是否可选,也可以理解为是否向下传递。
- 在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false
- 在2中设置不向下传递,由于3中没有配置junit,而2又不向它传递会直接报错
排除依赖
- exclusions可用于排除依赖,注意exclusions是写在dependency中
- 在3中设置排除1传递的依赖,因为2依赖1,3依赖2,所以默认的3中会有1的依赖,可以使用exclusions将其排除
2.4 生命周期
-
Maven生命周期就是为了对所有的构建过程进行抽象和统一。
-
包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。
-
生命周期可以理解为构建工程的步骤。
-
在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
- Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle: 生成项目报告,站点,发布站点。
Clean生命周期:清理项目
- Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
- 也就是说,mvn clean 等同于 mvn pre-clean clean
- 如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
- 这是Maven很重要的一个规则,可以大大简化命令行的输入。
Default生命周期:构造项目
- Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段
validate
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 接受编译好的代码,打包成可发布的格式,如 JAR、WAR
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
- 运行任何一个阶段的时候,它前面的所有阶段都会被运行
- 这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包,安装到本地仓库
- 此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
Sit生命周期:生成项目站点
- 这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上