1 maven的简介
1.1什么是maven
maven是Apache下的开源项目,项目管理工具,管理Java项目,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
1.2 maven仓库
- 中央仓库:就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2/
- 本地仓库:相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(也就是在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。
- 私服:在公司内部架设一台私服,其它公司架设一台仓库,对外公开。
2.maven环境搭建
2.1 maven下载
可以到maven的官网下载 http://maven.apache.org/download.cgi
将下载好的压缩包进行解压就行了
2.2 环境变量配置
新建系统变量 MAVEN_HOME 变量值:E:Mavenapache-maven-3.3.9 (注意:这里的路径是maven安装包的路径)
编辑系统变量 Path 添加变量值: ;%MAVEN_HOME%in
2.3 仓库配置
在电脑任意盘符新建一个文件夹,用作本地仓库,例如我这里在桌面新建一个文件夹repository
其路径为:C:Userseric.fangDesktop epository
本地仓库配置:打开maven的安装目录中conf/ settings.xml文件,在这里配置本地仓库:
<localRepository>C:Userseric.fangDesktop epository</localRepository>
远程仓库配置:远程仓库也是在maven的安装目录中conf/ settings.xml文件中进行配置,它被配置在mirrors标签中
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
2.4 eclipse配置maven
1)配置maven的安装目录
进入eclipse ,选择菜单windows - Preferences , 在左侧的树状导航中
点击add按钮,弹出窗口后选择maven的安装目录,然后点击apply
2)配置User Settings
选择左侧树形导航的User Settings ,选择Maven目录下conf下的settingsxml,然后点击Update Settings 、Reindex 和Apply按钮.
选择菜单 window --> show View,然后选择 Rebuild Index 重新创建索引
2.5 idea配置maven
在settings搜索maven,然后对maven路径进行修改,并且设置仓库
3.maven入门
3.1 创建maven项目
在idea中选择菜单 File ->New->Project
这里我们不使用模板进行创建,直接点击next
在这里我们可以指定项目名,和项目的maven坐标
坐标包括:
Group Id:项目的名称,项目名称以域名的倒序,比如:com.gh
Artifact Id:模块名称(子项目名称)
Version:模块的版本,snapshot(快照版,没有正式发行)、release(正式发行版本)
输入后,Finish 。完成后如下图
项目目录结构说明:
/src/main/java 主体程序 java源文件(不要放配置文件)
/src/main/resources 主体程序所需要的配置文件(不要放java文件)
/src/test/java 单元测试程序 java源文件
pom.xml Maven进行工作的主要配置文件。
3.2 添加maven依赖
在pom的xml文件中加入如下内容
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> </dependencies
当刷新maven工程时,我们就能正常引入依赖了
3.3 maven生命周期
Maven有三套相互独立的生命周期,分别是:clean、default、site。clean主要是清理项目、default是Maven最核心的的构建项目、site是生成项目站点。每一个大的生命周期又分为很多个阶段。后面的阶段依赖于前面的阶段,这点有点像Ant的构建依赖。生命周期本身相互独立,用户可以仅仅调用生命周期的某一个阶段,也就是说用户调用了default周期的任何阶段,并不会触发clean周期以及site周期的任何事情。三大生命周期蕴含着小小的阶段,我们按顺序看一下
(1)clean周期:
pre-clean:准备清理
clean:真正的清理工作
post-clean:执行清理后的一些后续工作
(2)default周期:
validate:验证
initialize:初始化配置
generate-sources:生成源代码编译目录
process-sources:处理项目主资源文件,复制资源文件到outputclasspath
generate-resources:生成资源目录
process-resources:处理资源文件
compile:编译源代码
process-classes:处理编译后文件
generate-test-sources:生成测试目录
process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath
generate-test-resources:生成测试资源文件
process-test-resources:处理测试资源文件
test-compile:编译测试代码
process-test-classes:处理测试代码
test:单元测试运行测试代码
prepare-package:打包前的准备
package:将编译好的代码打包成为jar或者war或者ear等等
pre-integration-test:准备整体测试
integration-test:整体测试
post-integration-test:为整体测试收尾
verify:验证
install:安装到本地Maven库
deploy:将最终包部署到远程Maven仓库
(3)site周期:
pre-site:准备生成站点
site:生成站点及文档
post-site:站点收尾
site-deploy:将生成的站点发布到服务器上
3.4 maven常用命令
compile:编译
clean:清理,将target下的class文件清理
test: 执行单元测试类,执行src/test/java下的类
package :将java工程打成jar、war。
install:安装命令,将将程的jar发布到本地仓库
发布到仓库,目录按照本工程定义的坐标生成目录
4.maven多模块项目的概念
我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,这个时候我们就需要通过maven构建多模块
4.1 父工程
创建方式:创建一个maven工程,在pom.xml中指定打包方式为pom
建立该project的时候,我们要注意以下几点:
- 1.父工程本身也做为一个Maven项目,它必须有自己的POM
- 2.它的打包方式必须为: pom
- 3.引入了新的元素:modules---module
- 4.版本:父工程的版本和子模块版本一致
- 5.相对目录:每个module的值都是一个当前POM的相对目录
- 6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录</module>相一致。
- 7.习惯约定:为了方便构建,通常将父工程放在项目目录层的最顶层,其它module作为子目录存在。这样当我们打开项目的时候,第一个看到的就是父工程的POM
- 8.父工程减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
- 9.父工程和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么父工程的POM文件也需要做出相应的更改。
4.2 子模块
子模块又叫子工程,它的创建是在父工程的基础上,创建子模块是在父工程根目录new一个 module
建立该module的时候,我们要注意以下几点:
- 1.新的元素:<parent> , 它是被用在子模块中的
- 2.<parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
- 3.relativePath的默认值: ../pom.xml
- 4.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素
5.依赖管理
5.1 依赖范围
通常依赖范围我们是通过scope标签来指定的,如果不设置默认为compile,scope一般有以下四种值
1)compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖。
strus-core、spring-beans
打到war包或jar包。
2)provided 编译、和测试有效,A在编译和测试时需要B。
比如:servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)。
不会打到war。
3)runtime:测试、运行有效。
比如:jdbc驱动包 ,在开发代码中针对java的jdbc接口开发,编译不用。
在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库,需要的!!
会打到war。
4)test:只是测试有效,只在单元测试类中用。
比如:junit
不会打到war。
使用案例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
5.2 依赖传递
5.2.1 直接依赖
A依赖B,B是A的直接依赖。在A的pom.xml中添加B的坐标。
5.2.2 传递依赖
A依赖B,B依赖C,C是A的传递依赖。
5.2.3 依赖范围的依赖传递关系
传递依赖的范围:
5.3 版本控制
在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
pom.xml文件中,jar的版本判断的两种途径
1.如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version。
2.如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
5.4 排除依赖
当我们引入了同一个依赖的两个不同版本时,可能会出现版本冲突问题,所以我们需要排除低版本的jar包,通过exclusions标签来声明
例如:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>