Maven

一、构建
    传统构建工作繁琐、重复,每个项目重新准备。
二、使用入门
    Maven项目的核心是pom.xml。定义项目信息、如何构建、依赖等。
  • groupId:指定项目属于什么实际项目
  • artifactId:指定项目在实际项目中的唯一id。
  • version : 版本。SNAPSHOT 快照版。
  • name : 别名,非必须
    约定:
  • pom在根目录下
  • 源码在src/main/java下
  • 测试代码在src/test/java
  • 编译输出: target/classes
  • 打包方式jar
  • 包输出target/
    Archettype生成项目骨架。
    命令:
  • clean清理
  • build构件
  • install构件并安装到本地仓库
  • deploy构件发布到远程仓库
三、坐标、依赖
    坐标即为确定一个唯一点的方法,Maven通过坐标来确定构件。包括元素:
  • groupId
  • artifactId
  • version 
  • packaging  打包方式。可选,默认jar
  • classifier 定义一些附属构件,源码、文档等。不能指定,是由相关插件指定的。
    通过坐标可以确定唯一构件,可以指定依赖。dependency。dependency可配置元素:
  • 三个基本坐标
  • type依赖类型,对应packaging  
  • scope:范围,maven有三套classpath 编译、测试、运行,scope就是指定对哪个范围有效
    • compile : 编译范围,默认的值。三个范围均有效,表示编译、测试、运行均需要该依赖
    • test : 测试有效
    • provided : 编译和测试有效,运行无效。某些运行时容器已经提供的组件等。
    • runtime : 测试、运行有效。编译无效。
    • system : 与provided相同。需要用systemPath指定依赖的本地路径。
    • import:对三个范围均无影响。
  • optional : 是否可选
  • exclusions : 排除传递性依赖
    最佳实践:
  • 当传递性的引入不稳定依赖或依赖冲突,通过exclusions排除依赖。
  • 归类依赖,例如利用properties定义Spring版本,统一管理。引用使用。
  • 了解自己的pom,排除冗余。
四、仓库
    仓库内通过坐标和定义的规则,生成文件路径,管理多种多样的构件。
  • 本地仓库:首先检查。没有再请求远程仓库,同时缓存到本地仓库。
  • 远程仓库:很多公开的公用仓库。中央仓库,idcentral标识。私服,一般组织内部会有自己的仓库中心。
    maven的settings文件配置本地、远程仓库。位置 : .m2\setting.xml。本地仓库一般:.m2\repository\ 。默认不存在 ,需要自己拷贝过去。不要直接使用maven安装目录中的setting.xml。
  • 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系统属性、环境变量
    开发中经常会有环境差异,例如开发、测试、预发布、生产各种环境都有差异,最常出现的是数据库地址不同。通过profiles解决这个问题。首先在各种属性中,将这部分与环境相关的属性抽出来,然后配置成不同的profile。然后在使用的地方通过${}的方式引用。最后只需要在构建时通过-P指定想生效的profile的id就可以了。也可以指定一个profile为默认。

 

posted @ 2016-01-30 22:52  进击的璐璐  阅读(175)  评论(0编辑  收藏  举报