Maven
一、构建
传统构建工作繁琐、重复,每个项目重新准备。
二、使用入门
Maven项目的核心是pom.xml。定义项目信息、如何构建、依赖等。
- groupId:指定项目属于什么实际项目
- artifactId:指定项目在实际项目中的唯一id。
- version : 版本。SNAPSHOT 快照版。
- name : 别名,非必须
- pom在根目录下
- 源码在src/main/java下
- 测试代码在src/test/java
- 编译输出: target/classes
- 打包方式jar
- 包输出target/
命令:
- clean清理
- build构件
- install构件并安装到本地仓库
- deploy构件发布到远程仓库
三、坐标、依赖
坐标即为确定一个唯一点的方法,Maven通过坐标来确定构件。包括元素:
- groupId
- artifactId
- version
- packaging 打包方式。可选,默认jar
- classifier 定义一些附属构件,源码、文档等。不能指定,是由相关插件指定的。
- 三个基本坐标
- type依赖类型,对应packaging
- scope:范围,maven有三套classpath 编译、测试、运行,scope就是指定对哪个范围有效
- compile : 编译范围,默认的值。三个范围均有效,表示编译、测试、运行均需要该依赖
- test : 测试有效
- provided : 编译和测试有效,运行无效。某些运行时容器已经提供的组件等。
- runtime : 测试、运行有效。编译无效。
- system : 与provided相同。需要用systemPath指定依赖的本地路径。
- import:对三个范围均无影响。
- optional : 是否可选
- exclusions : 排除传递性依赖
- 当传递性的引入不稳定依赖或依赖冲突,通过exclusions排除依赖。
- 归类依赖,例如利用properties定义Spring版本,统一管理。引用使用。
- 了解自己的pom,排除冗余。
仓库内通过坐标和定义的规则,生成文件路径,管理多种多样的构件。
- 本地仓库:首先检查。没有再请求远程仓库,同时缓存到本地仓库。
- 远程仓库:很多公开的公用仓库。中央仓库,idcentral标识。私服,一般组织内部会有自己的仓库中心。
- repositories下配置远程仓库
- repository配置一个具体远程仓库。
- releases 、snapshots :
- enable : true/false 可不可以下载该仓库的release或snapshots 版构件
- updatePolicy : 跟新频率默认daily,每天检查。never、always每次构建、interval 每个多少分钟
- checksumPolicy:检查和校验文件的策略。构件都有校验文件。该参数配置校验失败怎么办:默认warn警告;ignore忽略;fail构建直接失败。
- servers下可以配置服务器的验证信息,用server节点。id要和需要需要验证的仓库的id对应。
- distributionManagement配置构建发布到远程仓库的仓库信息。里面分为发布版和快照版。
初始化、编译、测试、打包、测试、验证、部署、站点生成这一系列步骤组成生命周期。以前都是自己控制,比如ant时代,每个项目都要写复杂的脚本。Maven相当于对生命周期抽象出一个模型,然后将生命周期中的每个阶段的任务交付给插件来完成。每个阶段都有默认的插件。所以不指定插件也能开发,希望自由可以指定其他插件,甚至自己编写插件。
生命周期分为三套:
- clean 清理
- default 构建
- site 建立项目站点
插件:
- Plugin Goal 每个插件可能不止提供一个单一的功能,所以使用插件时要指定插件目标。
- 插件绑定: 每个插件目标对应一个阶段的工作。Maven核心为一些主要的步骤默认绑定了一些插件目标,所以不许配置就可以用。当然可以自定义绑定。通过phase绑定阶段。
主pom中module指定子模块。通过构建主pom,可以构建所有子模块。
子模块pom通过parent中三个基本坐标指定继承父pom。子模块继承父pom的groupid和version。可以覆盖。可继承的常用配置还包括:
- description
- url
- scm 版本控制系统信息
- properties
- dependencies
- dependencyManagement
- repositories 仓库配置
- build 源码目录、输出配置、插件配置
- reporting 报告
依赖管理:dependencyManagement。父pom中通过dependencyManagement生命依赖,并不会真实引进项目里。然后子pom引用依赖时,不必再指定version,因为父pom已经声明好了,这时候才是真正被引用进来。这样实现了统一管理,降低冲突和混乱的几率。
插件管理:pluginManageMent。
七、属性
- 内置属性:${basedir} 项目根目录 ${version}项目版本
- POM属性:
- 自定义:<properties>
- Setting文件中、Java系统属性、环境变量