maven是一款服务于Java平台的自动化构建工具。
maven构建过程中的各个环节:
- 清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
- 编译:将Java源程序编译成class字节码文件
- 测试:自动测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态web工程打war包,Java工程打jar包
- 安装:maven特定的改良,将打包得到的文件复制到仓库中的指定位置
- 部署:将动态web工程生成的war包复制到servlet容器的指定目录下,使其可以运行
maven安装:
- 配置Java环境变量
- 解压maven核心程序压缩包,放在一个非中文无空格路径下
- 配置maven相关的环境变量M2_HOME,path
- 验证mvn -v
mvn clean:清理
mvn compile:编译主程序
mvn test-compile:编译测试程序
mvn test:执行测试
mvn package:打包
POM:Project Object Model项目对象模型
pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置
坐标:
使用三个响亮在仓库中定位唯一的Maven工程,简称gav
groupId:使用公司或者组织域名倒序+项目名
artifactId:模块名
version:版本
Maven工程的坐标与仓库中路径的对应关系
根据Maven坐标查找仓库中的jar包,groupId/artifactId/version/artifactId-version
仓库:
仓库的分类:
本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
远程仓库:
私服:搭建在局域网中环境中的,为当前局域网范围内的所有Maven工程服务,一般使用Nexus
中央仓库:架设在Internet上,为全世界所有Maven工程服务
中央仓库镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的相应用户请求。
仓库中保存的内容:Maven工程
Maven自身所需要的插件
第三方框架或工具的jar包
我们自己开发的Maven工程
依赖:
Maven解析依赖信息时会到本地仓库中查找被依赖的jar包
对于我们自己开发的Maven工程,使用install命令进行安装后将依赖工程加入到本地仓库即可
依赖的范围:
compile范围依赖:
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:参与
test范围依赖:
对主程序是否有效:无效
对测试程序是否有效:有效
是否参与打包:不参与
provided范围依赖:
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
也不会参与部署
Maven依赖传递性:
好处:可以传递的依赖不必在每个模块工程中都重复声明,在最顶层的工程设置一次依赖即可。
注意:非compile范围的依赖不能传递,所以如果在各个模块都需要重新设置声明
依赖的排除:
需要设置依赖排除的场合
使用标签排除
依赖的原则:
解决模块工程之间jar包冲突的问题。
路径最短者优先原则,如下,MakeFriends依赖HelloFriend,HelloFriend依赖log4j的一个版本,同时HelloFriend又依赖Hello,而Hello又依赖log4j的另外一个版本,根据路径最短有限原则,MakeFriend会先到达HelloFriend依赖的log4j,所以MakeFriends最终会依赖HelloFriend依赖的log4j。
先声明者优先,先声明指的是dependency标签的生命顺序,如果MakeFriends同时依赖HelloFriend和OurFriends,但是这两个依赖同时依赖不同的log4j版本,路径是一样的,那么就根据声明顺序来,先声明的被依赖。
统一版本管理:如下使用Spring的版本都是4.0.0,如果需要统一升级到4.1.1版本,如何操作?不推荐手动一个个的修改。
在properties标签内使用自定义标签统一声明版本号,在需要统一版本的位置,使用${自定义标签名}引用声明的版本号
Maven生命周期:
各个构建缓解执行的顺序:不能打乱循序,必须按照既定顺序执行
Maven的核心程序黄总定义了抽象的生命周期,生命周期中的各个阶段的具体任务是由插件来完成的。
Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中的各个阶段:不论生命周期中的哪一个阶段,都是从这个生命周期最初的位置开始执行。
插件和目标:
生命周期的各个阶段仅仅定义了要执行的任务是什么
各个阶段和插件的目标是对应的
相似的目标由特定的插件来完成。
可以将目标看做是调用插件功能的命令。
有三套相互独立的生命周期,分别是
Clean Lifecycle在进行真正的构建之前进行一些清理工作
Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等
Site Lifecycle生成项目报告,站点,发布站点
他们相互独立,可以仅仅调用clean来清理工作目录,也可以只调用site来生成站点,当然也可以直接运行mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,平时在命令行输入的命令总会对应于一个特定的阶段,比如mvn clean,这个clean是Clean生命周期的一个阶段
Clean生命周期包含三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 一出所有上一次构建生成的文件
post-clean执行一些需要在clean之后立刻完成的工作
site生命周期:
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
经常使用的阶段是site阶段和site-deploy阶段,用以生成和发布Maven站点。
Default生命周期:
最重要的生命周期,阶段太多,不列举
在Eclipse中使用Maven
Maven插件:Eclipse已经内置
Maven插件的设置:
Installations:指定Maven额核心程序的位置,不建议使用插件自带的,使用自己安装的
User Settings:指定conf/settings.xml的位置,设置获取本地仓库的位置
Eclipse中创建Maven web工程
1、正常创建Maven工程,选择war形式
2、右键所选工程,然后Properties中的Project Facets中先取消掉Dynamic Web Module,应用之后再选中,会提示配置。如下图
继承:
对于test范围的依赖版本是不能传递的,可以使用继承解决,将依赖统一提取到父工程中,在子工程中声明依赖时不指定版本,以父工程统一设定的为准,也便于修改。父工程打包方式为pom。
创建一个Maven工程作为父工程,打包方式为pom
在子工程中声明对父工程的引用
将子工程的坐标中与父工程坐标中重复的内容删除
在父工程中统一声明所需的依赖
在子工程中删除所需依赖的版本号
注意:配置集成后,执行安装命令,必须先安装父工程
聚合:
作用使一键安装各个模块工程
在一个总的聚合工程中配置各个参与聚合的模块,并不一定需要在父工程中配置聚合,但是一般情况下还是配置在父工程的,使用时在聚合工程上的pom文件右键操作
工程自动部署:
配置相应的插件等