前言
maven 用了很多年了,但是经常遇到不知道的maven知识,所以买了《maven 实战》这本书看看,补习一下我不知道或者模糊的maven知识.这本书写的通俗易懂,知识详细,值得一看!!!
坐标详解
- <packaging><packaging/>
默认值为jar,一般与文件的扩展名一致,但是也不是绝对,比如<packaging>maven-plugin<packaging/> 的文件扩展名为.jar - classifier
nexus-indexer-2.2.0-javadoc.jar ,nexus-indexer-2.2.0-sources.jar中的javadoc和sources就是classifier .classifier 能直接指定,而是有插件帮助生成的.
依赖范围
- provided 对于编译和测试的classpath有效, 典型就是servlet-api
- runtime 对于测试和运行的classpaht有效,比如jdbc驱动
- system 对于编译和测试的classpath有效,使用system依赖范围时必须通过systemPath元素知道那个依赖的文件路径.
依赖调解
例1:A→B→C→X(1.0) , A→D→X(2.0) 依赖调解第一原则:路径最近者优先,所以X(2.0)会被解析使用.
例2:A→B→X(1.0) , A→D→X(2.0) 依赖调解第二原则:第一声明者优先.
可选依赖
<dependency>
<groupId>xx.xxx</groupId>
<artifactId>xxx</artifactId>
<version>2.0.1</version>
<optional>true</optional>
</dependency>
optional=true 就是可选依赖,无法被传递,需要显示声明.
依赖优化
//查看当前项目已解析的依赖
mvn dependency:list
//查看当前项目的依赖树
mvn dependency:tree
//只会分析编译主代码和测试代码需要用到的依赖,在输出信息中
//Used undeclared dependencies found: 用到的但是没有声明的
//Unused declared dependencies found: 没有用到的但是声明了的
mvn dependency:analyze
生命周期和插件
三套生命周期
初学者往往以为生命周期是一个整体,其实不然,maven拥有三套互相独立的生命周期,它们分别是clean,default和site.
插件自定义绑定
<execution>
<!-- id 为post-unit-test的任务-->
<id>post-unit-test</id>
<!--绑定到test,生命周期 -->
<phase>test</phase>
<goals>
<!-- 插件中目标 -->
<goal>report</goal>
</goals>
</execution>
如果多个目标被绑定到同一个阶段,它们的执行顺序会是怎样的?
答案很简单,当多个插件目标绑定到同一个阶段的时候,这些插件声明的先后顺序决定了目标的执行顺序.
聚合与继承
聚合
聚合模块与其他模块的目录结构并非一定要是父子关系,比如下面这种也可以
<modules>
<module>../asmpcloud-common</module>
<module>../asmpcloud-service-center</module>
<module>../asmpcloud-job-center</module>
</modules>
元素 relativePath 表示父模块pom的相对路径,该路径中…/xxx/pom.xml 表示 pom位置在于该项目平行的目录下.当项目构建时,maven会首先根据relativePath检查父pom,如果找不到,再从本地的仓库中去找.relativePath的默认值是…/pom.xml,也就是说,maven默认父pom在上一层目录下.
可继承的pom元素
我只罗列一下可能会用到的
- groupId
- version
- description
- organization
- …
- url
- properties
- dependencies
- dependencyManagement
- repositories
- build
- …
Import
<!-- 锁定SpringCloud版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springcloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
如上配置,<scope>import</scope> 只有在<dependencyManagement></dependencyManagement>中才能生效.使用该范围的依赖通常指向一个pom,作用是将目标pom中的dependencyManagement配置导入并合并到当前pom的 dependencyManagement 中 .