yaochow@home:~$

【介绍】Maven

Maven是一个采用纯Java编写的开源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目。

MAVEN 核心功能

  • MAVEN核心作用是编译、测试、打包。
  • 根目录下的pom.xml文件设置分组ID与artifactId。
  • MAVEN基于约定的方式从项目中获取源码与资源文件进行编译打包。
  • 对于项目所依赖的组件与本地仓库引用,如果本地仓库不存在则会从中央仓库下载。

MAVEN核心配置

  • 项目依赖(内部、外部)
  • 项目聚合与继承
  • 项目构建配置
项目依赖

项目依赖是指MAVEN通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目CLASSPATH。

依赖传播特性

我们的项目通常需要依赖第三方组件,而第三方组件又会依赖其它组件,遇到这种情况MAVEN会将依赖网络中的所有节点加入CLASSPATH当中,这就是MAVEN的依赖传播特性。

依赖优先原则

基于依赖传播特性,导致这个依赖网络会很复杂,难免会出现相同组件不同版本的情况。MAVEN此时会基于依赖优先原则选择其中一个版本。

  • 第一原则:最短路径优先。
  • 第二原则:相同路径下配置在前的优先。在同一pom文件中,第二原则不在适应。
可选依赖

可选依赖表示这个依赖不是必须的。通过在<dependency> 添加<option>true</option>表示,默认是不可选的。可选依赖不会被传递。

排除依赖

即排除指定的间接依赖。通过配置<exclusions>配置排除指定组件。

依赖范围

像junit这个组件我们只有在运行测试用例的时候用到,就没有必要在打包的时候吧junit.jar包构建进去,可以通过MAVEN的依赖范围配置<scope>来达到这种目的。MAVEN总共支持以下四种依赖范围:

  • compile(默认):编译范围,编译和打包都会依赖。
  • provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar
  • runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar
  • test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar

system:表示由系统中CLASSPATH指定。编译时依赖,不会打包进去。配合<systemPath>一起使用。如:java.home下的tool.jar

system除了可以用于引入系统CLASSPATH中的包,也可以用于引入系统非MAVEN收录的第三方jar,做法是将第三方jar放置在项目的lib目录下,然后配置相对路径,但因system不会打包进去所以需要配合maven-dependency-plugin插件使用。

项目聚合与继承
聚合

是指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用<modules>进行配置其中对应的是子工程的相对路径。

继承

继承是指子工程直接继承父工程当中的属性、依赖、插件等配置,避免重复配置。

  • 属性继承
  • 依赖继承
  • 插件继承

子工程重写之后以子工程为准。

依赖管理

通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一致,这是就可以在父工程中加入<dependencyManagement>声明该工程需要的jar包,然后子工程中引入。

项目属性

通过<properties>配置属性参数,可以简化配置。

项目构建配置
  • 构建资源配置
  • 编译插件
  • profile指定编译环境
构建资源配置

基本配置:

  • defaultGoal:执行构建时默认的goal或phase,如jar:jar 或者 package 等。
  • directory:构建的结果所在的路径,默认为${basedir}/target目录
  • finalName:构建最终结果的名字,该名字可能在其它plugin中被改变

<resources>配置:

resources,build过程中涉及的资源文件

  • targetPath:资源文件的目标路径
  • directory:资源文件的路径,默认位于${basedir}/src/main/resources/目录下
  • incluedes:一组文件名的匹配模式,被匹配的资源文件将被构建过程处理
  • excludes:一组文件名的匹配模式,被匹配的资源文件将被构建过程忽略。同时被incluedes和excludes匹配的资源文件将被忽略。
  • filtering:默认false,true表示通过参数对资源文件中的${key}在编译时进行动态变更。替换源 -Dkey和pom文件中的<properties>值或<filters>中指定的properties文件。

MAVEN生命周期

  • 生命周期的概念与意义
  • MAVEN三大生命周期与其对应的phase(阶段)
  • 生命周期与插件的关系
  • 生命周期与默认插件的绑定
生命周期的概念与意义

在项目构建时通常会包含清理、编译、测试、打包、验证、部署,文档生成等步骤,MAVEN统一对其进行了整理抽象成三个生命周期及各自对应的多个阶段。这么做的意义时:

  • 每个阶段都成为了一个扩展点,可以采用不同的方式来实现,提高了扩展性与灵活性。
  • 规范统一了MAVEN的执行路径。

在执行项目构建阶段时可以采用jar方式构建也可以采用war包方式构建提高了灵活性。

执行清理phase:mvn clean

执行compile phase:mvn compile

也可以同时执行清理加编译:mvn clean compile

MAVEN三大生命周期与其对应的phase(阶段)

MAVEN总共包含三大生命周期

  • cleanLifecycle:清理生命周期,用于清理项目。
  • defaultLifecycle:默认生命周期,用于编译、打包、测试、部署等。
  • siteLifecycle:站点文档生成,用于构建站点文档

三大生命周期相互独立执行,也可以合在一起执行。但lifecycle中的phase是有严格执行顺序的,比如必须是看执行完compile才能执行package动作,此外phase还有包含逻辑存在,即当执行和一个phase时,其前面的phase会自动执行。

生命周期与插件的关系

生命周期的phase组成了项目构建的完整过程,但这些过程具体由谁来实现呢?这就是插件,MAVEN的核心部分代码量其实很少,大部分实现都是由插件来完成的。比如:test阶段就是由maven-surefire-plugin实现。在pom文件中我们可以设置指定插件目标(goal)与phase绑定,当项目构建到达指定phase时就会出发这些插件goal的执行。一个插件有时会实现多个phase,比如:maven-compiler-plugin插件分别实现了compile和testCompile。

总结:

  • 生命周期的阶段可以绑定具体的插件及目标
  • 不同配置下同一个阶段可以对应多个插件和目标。
生命周期与插件的默认绑定

在我们的项目当中并没有配置maven-compiler-plugin插件,但当我们执行compile阶段时一样能够执行编译操作,原因是maven默认为指定阶段绑定了插件实现。

MAVEN自定义插件开发

  • 插件的相关概念
  • 常用插件的使用
  • 开发一个自定义插件
MAVEN插件相关概念

插件坐标定位:插件与普通jar包一样包含一组坐标定位属性。

常用插件的使用

除了通过配置的方式使用插件以外,MAVEN也提供了通过命令直接调用插件目标。

开发一个自定义插件

实现步骤:

  • 创建MAVEN插件项目
  • 设定packaging为maven-plugin
  • 添加插件依赖
  • 编写插件实现逻辑
  • 打包构建插件

NEXUS私服搭建与核心功能

  • 私服的使用场景
  • NEXUS下载安装
  • NEXUS仓库介绍
  • 本地远程仓库配置
  • 发布项目至NEXUS远程仓库
  • 关于SNAPSHOT(快照)与RELEASE(释放)版本说明。
私服使用场景
  • 公司不能连接公网,可以用一个私服来统一连接
  • 公司内部jar组件的共享