什么是Maven?
Maven 译 ‘专家,行家’, 又是apache下的一个开源项目,相比于SVN(版本控制器)不同,他是一款项目管理工具,Maven也是由java编写,所以同样具有跨平台的特点,当然也就需要有JDK的环境支持.
Maven的作用
- (1) 进行项目构建
①高度自动化,跨平台,标准化的 只有遵守规范才能得到推广 - (2 依赖jar包管理
①开发一款项目不得不依赖第三方的jar包 - (3) 依赖信息管理
①自动生成项目信息
为什么要使用Maven
- 在原先的项目中,如果需要用到第三方的jar包,必须有开发人员手动去网上下载(这就会导致每个人下载的版本不同,内容也可能不同),然后手动在 复制,粘贴到 WEB-INF/lib 下,而且是每一个项目都需要这样,这样导致带来了:同样的jar出现在不同的工程中,浪费存储空间,工程臃肿,而Maven就可以很好的解决这一问题,通过在pom.xml(POM 项目对象模型,可类比之前学过的DOM对象模型,这里存放工程的核心配置)文件中添加依赖引用仓库中的jar来解决;
- Maven之所以能够得到推广,就是因为有一套规范,从中央仓库下载到本地仓库的jar都是统一规范的,这样就不会存在项目工程之间jar包冲突的问题。
- jar包之间的依赖管理会由Maven自动导入,比如 commons-fileupload.jar --> commons-io.jar在导入commons-fileupload.jar时,maven会帮我们自动导入commons-io.jar(这个我试的时候只有高版本的jar会自动导入)
- 拥有生命周期(核心),简化操作,高度自动化的体现。
Maven仓库
- 本地仓库
- 远程仓库
中央仓库
镜像仓库
私服
大小排序: 中央>镜像>私服>本地
访问速度排序:本地> 私服> 镜像 >中央
本地仓库位置
默认位置: ~/.m2/repository/
自定义位置:maven的本地仓库配置到指定的路径下,方便管理。在文件conf–>settings.xml 下修改< localRepository >新的仓库路径< /localRepository >
Maven的目录结构
Maven 的生命周期
Maven有三套相互独立的声明周期
- Clean LifeCycle
进行真正构件之前进行一些清理工作 - Default LifeCycle
构件的核心部分,编译,测试,打包,部署等等 - Site LifeCycle
生成项目报告,站点。
主要说一下Default 生命周期
其中选中的就是我们经常用到的阶段,下面就以一个例子说明:
用Maven输出HelloWorld!
注意: 执行mvn: 必须在pom.xml所在目录中执行
按照Maven规范目录将HelloWorld.java 和testHelloWprld.java放在正确的文件夹下,然后从Dos命令里面进入Maven项目:
mvn compile --只编译main目录中的java文件 ,编译结束后会生成一个target文件,存 放.class (第一次执行命令时,因为需要下载执行该命令的基础环境,所以会从中央仓库下载该环境到本地仓库,时间很长,耐心等待,不要放弃)
mvn test 测试 同样也需要下载各种插件,生成.testClass文件
mvn package 打成jar/war前提是:前面的步骤必须是成功的,(生命周期)
mvn install 将开发的模块 放入本地仓库,供其他模块使用 (放入的位置 是通过gav决定)
mvn clean 删除target目录(删除编译文件的目录) 该命令既是最后一步,也是第一步。
mvn deploy 该命令是将项目发布到私服上,供所有局域网的人使用,但前提是必须配置好私服,这里就不做展示了。
Maven 命令之所以能运行是因为有下面插件的支持。
Maven的依赖管理
依赖原则:为了防止冲突
a.路径最短优先原则(很好理解,谁买东西会舍近求远呢?)
b.路径长度相同:
i.在同一个pom.xml文件中有2个相同的依赖(覆盖):后面声明的依赖 会覆盖前面声明的依赖 (严禁使用本情况,严禁在同一个pom中声明两个版本不同的依赖)
ii.如果是不同的 pom.xml中有2个相同的依赖(优先):则先声明的依赖 ,会覆盖后声明的依赖
依赖管理的自动导入
依赖长度相同:
在Maven_HelloTime下查看pom.xml
有些人奇怪的是 pom.xml中就没没有依赖junit的jar啊,为什么会导入呢???
这就是依赖传递的范围scope,只有当scope为compile时,传递依赖才会生效
Maven的继承
- 统一管理版本
- 消除重复
继承实现步骤:
1.建立父工程: 父工程的打包方式为 pom
2.在父工程的pom.xml中编写依赖:
< dependencyManagement >
< dependencies >
< dependency >
3.子类:
< !-- 给当前工程 继承一个父工程:
1加入父工程坐标gav
2当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径
–>
< parent>
<groupId>org.rjxy.maven</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../B/pom.xml</relativePath>
</parent>
4.在子类中 需要声明 :使用那些父类的依赖
<!-- 声明:需要使用到父类的junit (只需要ga) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
Maven的聚合
使用聚合的原因
比如 Maven2 依赖于 Maven1,则在执行时:必须先将 Maven1 先加入到本地仓库(install),之后才能执行Maven2,这点不符合Maven高度自动化的特点。
以上 前置工程的install操作,可以交由“聚合” 一次性搞定 一键安装各个模块到本地仓库。。。
聚合的使用
聚合的配置
聚合的配置 只能配置在(打包方式为pom)的Maven工程中