【介绍】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组件的共享