尚硅谷 maven
Maven是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有着重要作用,Maven是一款在大型项目开发过程中不可或缺的重要工具
一、目前掌握的技术
二、生产环境下开发对maven的需求
1、一个项目就是一个工程
如果项目非常大,就不适合继续使用package来划分。而是每个模块对应一个工程
分工,协作。
* 借助于maven,就可以将一个项目拆分成多个工程!!!
2、项目中的jar包必须手动黏贴到 WEB-INFO下的lib目录中
导致的问题:同样的jar包文件会重复出现在不同的项目工程中,一方面浪费存储空
间,一方面也让项目比较臃肿
借助于maven,可以将jar包仅仅保存在仓库中,有需要使用的工程,引用这个文件
接口,并不需要真的把jar包复制过来
3、jar包需要自己下载
借助于maven可以以一种非常规范的方式来下载jar包。因为所有知名的框架
或者第三方工具的jar包已经按照统一的规范放在了中央仓库中!
4、jar包依赖的其他jar包,需要自己手动加入到项目中
如果jar包之间的依赖关系都需要程序员自己非常清楚的了解,就会极大地增
加学习成本
三、构建的概念
1、maven是一款服务于java平台的自动化构建工具
gradle
2、什么是构建?
编译 --> 部署 --> 运行
3、运行时环境
运行时环境 其实是一组jar包的引用,并没有将jar包本身copy到工程中,所以不是目录!!
其中 :
jre system library ==> jdk 中的核心jar包
apache tomcat v6.0 ===> 和tomcat 相关的包
一个BS项目最终运行的不是动态web工程本身,而是这个web工程 "编译的结果”
构建过程中的各个环节
【1】清理 :将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
【2】编译:将java源程序编译成class字节码文件
【3】测试:自动测试,自动调用junit程序
【4】报告:测试程序的执行结果
【5】打包:动态web工程打成war包,jar工程打成jar包
【6】安装:maven的特定概念==》将打包得到的文件复制到“仓库”中的指定位置
【7】部署:将动态web工程生成的war包复制到servlet容器的指定目录下,使其可以运行
maven 可以进行自动化构建
四、安装:
1、检查 JAVA_HOME 环境变量 (为什么?maven是通过java编写的!!)
2、解压Maven核心程序的压缩包,放在一个非中文无空格的环境下
3、配置Maven 相关的环境变量
4、通过 mvn -v 命令查看maven版本 判断是否安装成功!!
五、Maven的核心概念
1、约定的目录结构
2、pom
3、坐标
4、依赖
5、仓库
6、声明周期、插件、目标
7、继承
8、聚合
六、第一个Maven工程
1、创建约定的目录结果
1)根目录:工程名
2)src目录:存放源码
3)pom.xml :Maven工程的核心配置文件
4)main 目录:存放主程序
5)test目录:存放测试程序
6)java目录:存放java源文件
7)resource:存放框架或者其他工具的配置文件
2、为什么要遵守约定的目录结构
1)Maven负责我们项目的自动化构建,以编译为例,Maven要想进行编译,那他必须知道
java源文件保存在哪
2)如果我们自定义的东西想要让框架知道,有两种办法
①以配置的方式明确告诉框架
②遵循框架内部存在的约定
log4j.properties
七、常用maven命令
1)注意:执行与构建过程相关的maven命令,必须进入pom.xml所在的目录
与构建过程相关:编译 测试 打包
2)常用命令:
【1】mvn clean :清理
【2】mvn compile: 编译主程序
【3】mvn test-compile :编译测试程序
【4】mvn test : 执行测试
【5】maven package :打包
八、关于联网问题
1)maven的核心程序中仅仅定义了抽象的生命周期,具体的工作必须由特定的插件来完成,
而插件本身并不包含在Maven的核心程序中
2)当我们执行的Maven命令需要用到插件时,Maven核心程序会先到本地仓库中去查找
3)本地仓库的位置 \.m2\respository
4) maven核心程序在本地仓库中 找不到需要的插件,会自动连接外网,到中央仓库中下载
5)如果不能联网,则构建失败
6) 修改默认本地仓库的位置,让Maven核心程序去我们指定的目录下寻找插件
九、POM
1、含义:project object model 项目对象模型
2、pom.xml对于Maven工程是核心配置文件,与构建过程有关的一切配置都是在这里配置的
十、坐标
1、maven中的坐标:
使用下面三个向量在仓库中唯一定位一个maven工程
1)groupid :公司或组织的域名倒叙+ 项目名
2)artifactid : 模块名
3)version:版本
2、Maven工程的坐标与仓库中路径的对应关系
十一、仓库
1、分类:
1)本地仓库:当前电脑上部署的仓库服务
2)远程仓库:
① 私服 : 搭建在局域网环境中,为局域网内的所有Maven工程服务
②中央仓库:架设在internet上,为全世界所有的Maven工程服务
③中央仓库的镜像:为了分担中央仓库的流量,用于提升用户的访问速度
2、仓库中保存的内容:Maven工程
1)Maven自身所需要的插件
2)第三方框架或者工具的jar包
3)我么自己开发的maven工程
十二、依赖
1、Maven解析依赖信息时,会到本地仓库中查找被依赖的jar包
对于我们自己开发的maven工程,使用mvn install 将其打包装进仓库
2、依赖的范围
1) compile 范围依赖
对主程序是否有效? 有效
对测试程序是否有效? 有效
是否参与打包? 参与
2)test范围依赖
对主程序是否有效? 无效
对测试程序是否有效? 有效
是否参与打包? 不参与
典型例子 : junit
3) provided 范围依赖: 有些jar包,在开发的时候需要,但是部署和运行的时候不需要
对主程序是否有效? 无效
对测试程序是否有效? 有效
是否参与打包? 不参与
是否参与部署? 不参与
典型例子 : servlet-api.jar
十三、生命周期
1、什么是maven的生命周期?
各个构建环节的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
2、maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务
是由插件完成的
3、maven不论现在执行的是生命周期的哪个阶段,都是从生命周期中最初的位置
开始执行的
4、插件和目标
1)生命周期的各个阶段仅仅定义了要执行的任务是什么
2)各个阶段和插件目标是对应的
3)相似的目标由特定的插件来完成
十四、在Eclipse中使用maven
1、设置maven的安装目录
2、设置user setting文件
3、基本操作
1)创建maven版的java工程
2)创建maven版的web工程
3)执行maven命令
十五、依赖【高级】
1、依赖的传递性
优点:可以传递的依赖,不必在每个模块工程中重复声明
【注意】 非compile类型的依赖不能传递,所以在各个工程模块中,有需要就得重复声明
2、依赖排除
[2] 依赖排除的设置方式
3、依赖的原则说明
4、统一管理依赖的版本
建议配置方式
1)在properties 内,同意声明版本号
2)在需要统一版本的位置,使用 ${自定义标签名} 引用声明的版本号
十五、继承
1、现状
2、统一管理各个模块工程中对junit版本的依赖
3、解决思路
将junit依赖版本统一提取到父工程中, 在子工程中声明junit依赖时,不指定版本,‘
以父工程统一设定的为准
4、操作
1) 创建一个Maven工程作为父工程,主要打包的方式为pom
2) 在子工程中声明对父工程的引用
3)将子工程中坐标与父工程中坐标 重复的部分删除
4)在父工程中统一配置依赖
5)在子工程中删除junit依赖的版本号
十六、聚合
1、作用:一键安装各个模块的工程
2、配置方式:在一个总的聚合工程中,配置各个参与的模块