Maven
一、概述
1、介绍
apache组织提供的顶级项目
但凡是阿帕奇提供的技术,都是由java开发工具
项目的管理工具
2、完成一个java项目需要做那些工作
项目要做什么,项目组成部分
设计项目,步骤,使用哪些技术,需要多少人,多长时间
组建团队,招人,购置设备,服务器,软件,笔记人…..
开发人员编写代码,开发人员需要测试
测试人员再次进行测试,测试项目功能是否符合要求
Maven可以使我们做上面/下面这些功能更加简单
3、对比
传统开发项目【没有使用maven】
很多模块,模块之间的关系,手动管理十分繁琐
项目需要第三方功能【jar包】 需要手动从网络中获取各个jar包
手动管理jar包的版本
手动管理jar文件之间的依赖 【项目要使用a.jar需要使用b.jar里面的类】
使用maven管理的项目
可以管理jar文件,自动下载jar和他的文档,源代码
自动管理jar之间的依赖 【a.jar需要b.jar maven会自动下载】
自动管理jar版本
帮你编译程序 .java —-> .class
帮你测试你的代码 是否正确
帮你打包文件,形成jar文件或war文件
帮你部署项目
3、什么是构建
项目的构建 【面向过程的,就是一些步骤】
完成项目代码的编译,测试,打包,部署
4、maven所支持的构建:
清理 (mvn clean)【把之前项目编译的东西删除掉,为新的编译代码做准备】
编译 【把源代码编译为可执行代码 .java—>.class 批量编译】
一次性的编译成千上百个文件,和javac 不一样 javac只能一次一个
测试 【maven可以执行测试程序代码,验证你的功能是否正确。】
批量的,maven可以同时执行多个测试代码,同时测试很多功能
报告 【生成测试结果的文件,测试通过没有】
打包 【把你的项目中所有的calss文件,配置文件等所有资源放到一个压缩文件中】
这个压缩文件就是项目的结果文件,通常java程序的压缩文件都是jar后缀 .jar
对于web应用 那么他的压缩文件是 .war
安装 【把5中生成的文件 jar文件或war文件安装到仓库之中】
部署 【把程序安装好可以执行】
5、maven是如何管理jar包的
首先在【本地仓库】 —— >【私服】 ——> [镜像中央仓库]——->【中央仓库】
6、作用
管理项目构建生命周期
管理项目中的jar包
管理项目中的基础信息(文档管理,测试报告)
7、maven的使用方式
- 独立使用maven,使用maven的各种命令,完成代码的编译、测试、打包等。
- 结合开发工具使用 在IDEA中使用maven 简单快捷 不需要记忆命令
二、安装和配置及核心
1、maven工具的安装和配置
需要从maven的官网下载maven的安装包 【用maven必须先配置好jdk】
下载地址
- 8.1版本和3.5.4,下载不同版本只需要修改里面的内容即可
https://mirror.nodesdirect.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
https://mirror.nodesdirect.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip
目录
- bin 放可执行程序,主要是 mvn.cmd
- conf setting.xml maven工具本身的配置文件
配置环境变量
在系统的环境变量中指定一个 M2_HOME的名称,指定他的值是maven工具安装目录,bin之前的目录。
把M2_HOME加入到path之中 %M2_HOME%\bin\
备注:遇到如下问题,可以采用如下方法配置
‘mvn’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。
环境变量:
MAVEN_HOME : D:\maven\apache-maven-3.5.4
path: %MAVEN_HOME%\bin\
把maven的环境变量上移到紧挨着java环境变量(在java配置下面)
2、验证以下maven是否配置成功
在cmd窗口中输出 mvn -v【查看maven的版本】
注意 电脑上一定要有 JAVA_HOME JDK环境变量
出现以下内容说明maven配置成功
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: D:\maven\apache-maven-3.5.4\bin\..
Java version: 1.8.0_91, vendor: Oracle Corporation, runtime: D:\Java\jdk1.8.0_91\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
三、Maven核心概念
1、总体
POM
一个文件 名称是pom.xml
pom翻译过来是项目对象模型
maven把一个项目当作一个模型使用,控制maven构建项目的过程,管理jar依赖
约定的目录结构
maven项目的目录和位置是有规定的
坐标
是一个唯一的字符串,用来表示资源的。
依赖管理
用来管理你的项目中可以使用的jar包
仓库管理
资源存放的位置
生命周期
maven构建项目的过程
插件和目标
执行maven构建的时候,用的工具是插件
继承
集合
2、maven约定的目录结构
每一个maven的项目在磁盘中都是一个文件夹
Hello/
// 项目名**----/src**
---------/main
// 放置主程序目录-----------------/java
// 放程序的包 和包中的java文件-----------------/resources
//java程序中要使用的配置文件---------/test
// 放测试程序代码和文件-----------------/java
// 放测试的包 和包中的java文件-----------------/resources
//测试程序中要使用的配置文件**----/pom.xml**
// maven的核心文件(必须有) 向maven要jar包**----/target**
// 编译后的class文件 不需要创建 maven命令在执行时自动创建
执行mvn compile【编译】 结果是在项目的根目录下自动生成target目录 【结果目录】 maven生成的class文件都存在于里面
3、仓库
3.1 修改本地仓库地址
本地仓库默认位置: C://用户/登录用户名称/.m2/resporsitory
修改本地仓库的位置
修改maven配置文件 conf/settings.xml
修改前先备份一份
第二步 修改
53 行指定你的目录【不要使用中文目录】E:\javaWeb\Maven\maven_repository
不要有中文,不要有空格
3.2 仓库是什么
存放 maven使用的jar和我们项目中使用的jar
maven 使用的插件(各种jar)
我们项目中使用的jar(第三方的工具)
3.3 仓库的分类
本地仓库, 在计算机上的文件夹,存放各种jar
远程仓库, 在互联网上使用网络才能使用的仓库
中央仓库 最权威的,世界上所有的开发人员都共享使用的集中的仓库
- 中央仓库的镜像 在各大洲的重要城市中都有镜像,用户使用时,优先使用镜像
- 私服 在公司内部 局域网中使用,不对外使用
3.4 仓库的使用
- maven仓库的使用不需要人为参与
- 开发人员使用mysql的驱动时—->maven首先查本地仓库——>查私服 ——> 中央仓库镜像——>中央仓库
4、POM 项目对象模型
pom.xml 文件 maven的核心
maven环境搭建好之后,所有的学习和操作都是关于pom.xml的
坐标【唯一值】
- 为了方便maven对jar的定位,在maven的世界中,每一个jar都有一个独立的坐标,相当于ip
4.1 gav
groupId 【自定义】组织id,一般是公司域名的倒写 com.yixuexi.autoStudy
artifactId 【自定义】 项目名称 也是模块名称给 对应groupId中项目中的子项目【名字可以不一样】
version 【自定义】版本号, 例如1.0.0 【-SNAPSHOT 后面添加表示快照】
这三个组成在一起就是一个坐标 【标识一个项目】
在互联网上唯一标识一个项目
https://mvnrepository.com 搜索使用的中央仓库, 使用groupId/artifactId作为搜索
为什么maven非要把坐标弄成唯一的?
- 因为maven是想把所有的jar包都弄成世界上独一份,不会有重复。这样通过公司域名的倒写,和项目名外加 版本号组合在一起 就能保证这个jar包世上独一份
- 这样的话在使用jar包的时候,就不会出现相同名称的jar包问题了
properties
- 定义一些配置文件
bulid
- 表示与构建相关的配置,例如设置jdk的版本
5、依赖
<dependencies></dependencies>
依赖 在项目中用到的各种资源【jar包之类的】
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- 上面的信息来自于 中央仓库 , 把 g a v 复制到dependecies中即可
- 相当于java中的import 可添加多个
- maven用来管理jar包,使用依赖可以把jar包引入到项目中
maven生命周期/插件
生命周期:清理,编译,测试,报告,打包,安装,部署
插件:maven提供的功能,用来执行清理,编译……的一些程序
四、常见命令、插件
1、生命周期
maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署
2、常见命令
maven可以独立使用,通过命令来完成 maven 生命周期的执行
**mvn clean**
清除 删除当前工程中的target文件夹**mvn compile**
编译 将当前工程中main文件夹下所有的java类编译为class,输送到target/classes中
同时把main/resources目录下的所有文件都拷贝到 target/classes目录下
**mvn test-compile**
编译测试文件 把编译好的测试文件放到 target/testclasses**mvn test**
测试 调用maven工程下 test文件夹下,所有测试类的所有测试方法,并生成测试报告 【执行测试的之后,前面的都会自动做一遍】**mvn package**
打包 先自己测试一遍【test中的java类】,没问题打成jar包或war包【class文件】, 输送到当前的target中去**mvn install**
安装 和 mvn package基本一致, 只是将jar包/war包推送到maven本地仓库中**mvn deploy**
部署
3、插件
maven命令执行时,真正完成功能的是插件【jar文件】
3.1 单元测试
什么是单元测试
junit是一个专门测试的框架(工具)
测试的是类中的方法,每一个方法都是独立测试的(都要写独立的测试方法)
方法是测试的基本单位(单元)
maven借助单元测试,批量的测试类中的大量方法是否符合预期
3.2 如何使用?
加入依赖 在pom.xml中加入单元测试依赖
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
在maven项目中的src/test/java目录下,创建测试程序
3.3 推荐方式
测试类的名称是 Test+要测试的类名
测试方法的名称是 test+要测试的方法名称
3.4 规则
方法是public
方法没有返回值
方法的名称是自定义的 推荐 test+要测试的方法名
方法的上面加上注解 @Test
3.5 验证
Assert.assertEquals(30,value)
// 第一个参数是期望值,第二个参数为实际值
如果两个值 相等说明是正确,如果不等就抛出异常
main里面的包名在test中也要有,也就是说测试里面也按照 com.yixuexi
4、依赖管理
<scope></scope>
表示依赖使用的范围
在maven构建项目的那些阶段中起作用
清理,编译,测试,打包,安装,部署 【阶段】
<scope>``**test**``</scope>
表示在执行测试的时候才会起作用
scope的值有
默认
**compile**
所有的阶段都要用到,并不是只在编译阶段
**test**
**provided**
提供者 【打包,安装时不需要】
5、maven的常用操作
maven的属性设置
properties 设置maven的常用属性
maven的全局变量
自定义属性
在properties中通过自定义标签 声明变量(标签名就是变量名)
<spring.version>1.1.2</spring.version>
在pom.xml文件中的其他位置,使用 ${标签名} 使用变量的值
自定义的作用
一般是定义以来的版本号,当项目中使用多个相同的版本号,先使用全局变量定义,再使用${变量名}
资源插件
五、Maven版本管理
介绍版本
项目开发过程中,快照版本会正常发包,即每次拉取最新代码;正式版本第一次发版拉取代码,后续不会在更新发布,初次使用者还会奇怪代码没有发布成功,就是这个原因;需要更新代码,要修改正式版本号,如1.0修改为1.1或者1.2。
快照版本:1.0-SNAPSHOT
正式版本:1.0
版本RELEASE
Maven要求你每次更改了代码都要发布到仓库,然后其他人去仓库下载你的代码。
为了区分代码是否做了修改,引入了版本RELEASE概念
也就是你每次更改代码,修改你的版本,Maven会自动下载相对应的版本
只要在 <version>2.1.9.RELEASE</version>
中以RELEASE为后缀就是版本
示例:
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.1.9.RELEASE</version>
版本规则
Maven主要是这样定义版本规则的:
<主版本>.<次版本>.<增量版本>
比如说1.2.3,主版本是1,次版本是2,增量版本是3。
主版本一般来说代表了项目的重大的架构变更,比如说Maven 1和Maven 2,在架构上已经两样了,将来的Maven 3和Maven 2也会有很大的变化。次版本一般代表了一些功能的增加或变化,但没有架构的变化,比如说Nexus 1.3较之于Nexus 1.2来说,增加了一系列新的或者改进的功能(仓库镜像支持,改进的仓库管理界面等等),但从大的架构上来说,1.3和1.2没什么区别。至于增量版本,一般是一些小的bug fix,不会有重大的功能变化。
指定版本的范围
Maven支持数学上“区间”的概念,用来指定依赖版本的一定范围,比如:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>[1.2.15,1.2.16]</version>
</dependency>
意思是版本x:1.2.15<=x<=1.2.16
# 控制依赖的版本范围:
(,1.0]: x <= 1.0
[1.2,1.3]: 1.2 <= x <= 1.3
[1.0,2.0): 1.0 <= x < 2.0
[1.5,): x >= 1.5
# 同时声明多个版本范围也是可以的,只要用逗号分隔即可:
(,1.0],[1.2,): x <= 1.0 或者 x >= 1.2
# 当你不希望依赖某个版本的时候,可以声明为:
(,1.1),(1.1,)
# 假如你想使用某依赖的最新版,又懒于手动更新,可以设置区间这样
[3.+,)[3.+,)
快照 SNAPSHOT
每次修改代码,都要发布版本,尤其是大型项目很多依赖jar时,会非常麻烦。
所以引入快照概念。
<version>1.0-SNAPSHOT</version>
即为快照
快照版的jar,每次构建时会自动下载最新版的依赖,不需要手工更改版本号。
六、Maven 三种archetype说明
archetype
archetype:原型的意思,可理解为Maven项目模板工具包
常用archetype
- cocoon-22-archetype-webapp (很少使用)
- maven-archetype-quickstart (简单java项目)
- maven-archetype-webapp (web项目,多个模块只能存在一个)
maven提供的41个骨架原型
maven提供的41个骨架原型分别是:
1: appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型)
2: appfuse-basic-spring(创建一个基于Hibernate,Spring和Spring MVC的Web应用程序的原型)
3: appfuse-basic-struts(创建一个基于Hibernate,Spring和Struts 2的Web应用程序的原型)
4: appfuse-basic-tapestry(创建一个基于Hibernate,Spring 和 Tapestry 4的Web应用程序的原型)
5: appfuse-core(创建一个基于Hibernate,Spring 和 XFire的jar应用程序的原型)
6: appfuse-modular-jsf(创建一个基于Hibernate,Spring和JSF的模块化应用原型)
7: appfuse-modular-spring(创建一个基于Hibernate, Spring 和 Spring MVC 的模块化应用原型)
8: appfuse-modular-struts(创建一个基于Hibernate, Spring 和 Struts 2 的模块化应用原型)
9: appfuse-modular-tapestry (创建一个基于 Hibernate, Spring 和 Tapestry 4 的模块化应用原型)
10: maven-archetype-j2ee-simple(一个简单的J2EE的Java应用程序)
11: maven-archetype-marmalade-mojo(一个Maven的 插件开发项目 using marmalade)
12: maven-archetype-mojo(一个Maven的Java插件开发项目)
13: maven-archetype-portlet(一个简单的portlet应用程序)
14: maven-archetype-profiles(简单java项目)
15:maven-archetype-quickstart()
16: maven-archetype-site-simple(简单的网站生成项目)
17: maven-archetype-site(更复杂的网站项目)
18:maven-archetype-webapp(一个简单的Java Web应用程序)
19: jini-service-archetype(Archetype for Jini service project creation)
20: softeu-archetype-seam(JSF+Facelets+Seam Archetype)
21: softeu-archetype-seam-simple(JSF+Facelets+Seam (无残留) 原型)
22: softeu-archetype-jsf(JSF+Facelets 原型)
23: jpa-maven-archetype(JPA 应用程序)
24: spring-osgi-bundle-archetype(Spring-OSGi 原型)
25: confluence-plugin-archetype(Atlassian 聚合插件原型)
26: jira-plugin-archetype(Atlassian JIRA 插件原型)
27: maven-archetype-har(Hibernate 存档)
28: maven-archetype-sar(JBoss 服务存档)
29: wicket-archetype-quickstart(一个简单的Apache Wicket的项目)
30: scala-archetype-simple(一个简单的scala的项目)
31: lift-archetype-blank(一个 blank/empty liftweb 项目)
32: lift-archetype-basic(基本(liftweb)项目)
33: cocoon-22-archetype-block-plain([http://cocoapacorg2/maven-plugins/])
34: cocoon-22-archetype-block([http://cocoapacorg2/maven-plugins/])
35:cocoon-22-archetype-webapp([http://cocoapacorg2/maven-plugins/])
36: myfaces-archetype-helloworld(使用MyFaces的一个简单的原型)
37: myfaces-archetype-helloworld-facelets(一个使用MyFaces和Facelets的简单原型)
38: myfaces-archetype-trinidad(一个使用MyFaces和Trinidad的简单原型)
39: myfaces-archetype-jsfcomponents(一种使用MyFaces创建定制JSF组件的简单的原型)
40: gmaven-archetype-basic(Groovy的基本原型)
41: gmaven-archetype-mojo(Groovy mojo 原型)