Maven做为Java语言的构建和依赖管理工具,已经被普遍使用。但对于maven的pom.xml的配置以及插件的使用,大部分人也仅仅限于了解的程度。工欲善其事,必先利其器。在拖延了好久后,决定仍是花时间根据《maven实战》这个书来进一步深刻了解maven的使用。这个系列是在学习maven过程当中的笔记和总结,聊以记录,利人利己。html
项目构建的文件名是与坐标相对应的,通常的规则是artifactId-version[-classifier].packaging,[-classifier]为可选java
pom.xml中<dependencies>标签下包含一个或多个<dependence>元素,来声明一个或多个项目依赖。每一个依赖能够包含的元素有spring
若是项目的依赖有本身的依赖,则项目也会加载依赖的依赖。好比spring-core依赖commons-logging,若是项目依赖了spring-core,那么它也会依赖commons-logging。当依赖的声明为可选时(<optional>true</optional>),依赖不会传递。apache
由于存在依赖传递,就会有不一样的依赖中有不一样版本的基础依赖,如A -> X(1.0),B -> C -> X(2.0),这样X就有不一样的版本,哪一个会被maven解析呢?因而就有了依赖调解的两个原则:api
项目中可能存在,由于一些缘由,不想引入某依赖的传递性依赖,则可使用exclusions。好比在使用spring时不想用commons-logging,则能够在spring-core中排除。maven
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.M5</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
好比在使用spring时,可能会用到spring-context,spring-jdbc,spring-tx等,但他们的版本是一致的,考虑到之后版本的升级,能够定义一个spring.version的properties来统一设置版本。ide
<properties> <spring.version>4.1.6.RELEASE</spring.version> </properties>
而在依赖的<version>中用${spring.version}代替工具
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
// 查看项目依赖列表 mvn dependency:list // 以树状显示依赖列表 mvn dependency:tree // 依赖分析 mvn dependency:analyze
maven有三套相互独立的生命周期,分别是clean,default,site。学习
每一个生命周期包含一些阶段(phase),这些阶段是有顺序的,而且后面的阶段依赖于前面的阶段。default是生命周期中最核心的部分,它包含不少阶段,如下是常见的几种阶段,全量的阶段可见http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference。测试
咱们能够用命令行来执行生命周期阶段
咱们知道maven的核心只定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件存在,maven会在须要时下载并使用插件。对于一个插件,可能会有多个功能,每一个功能就对应一个插件目标(Plugin Goal)。
好比maven-dependency-plugin有多个目标,如dependency:list,dependency:tree,dependency:analyze等,冒号前是插件前缀,冒号后是插件目标。相似的,compiler:compile(maven-compiler-plugin的compile目标)和surefire:test(maven-surefire-plugin的test目标)。
在使用时,须要将生命周期的阶段和插件目标相互绑定,以完成某个具体的构建任务。如maven-compiler-plugin的compile目标绑定的就是default生命周期的compile阶段。
maven内置了不少生命周期阶段同插件目标的绑定,好比打包类型为jar的default生命周期的内置插件绑定关系以下:
生命周期阶段 | 插件目标 | 执行任务 |
---|---|---|
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码至主输出目录 |
process-test-resources | maven-resources-plugin:testResources | 复制测试资源文件至测试输出目录 |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 |
test | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 建立项目jar包 |
install | maven-install-plugin:install | 将项目输出构件安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构件部署到远程仓库 |
出了内置的绑定关系外,用户能够选择将某个插件目标绑定到生命周期的某个阶段。一个例子是建立项目的源码jar包,可使用maven-source-plugin的jar-no-fork目标奖项目主代码打成jar文件,咱们将其绑定到verify阶段。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin>
有不少插件的目标在编写时已经定义了默认绑定阶段,可使用命令查看
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 Ddetail
能够看到输出的信息中有
source:jar-no-fork ... Bound to phase: package
即jar-no-for默认绑定的生命周期阶段为package
用户能够经过命令行和pom配置来配置插件的参数
1.命令行配置,用户能够在maven命令中使用-D参数,指定一个key-value的形式,来配置插件目标的参数。例如maven-surefire-plugin提供了一个maven.test.skip参数,当为true时,就跳过执行测试。
mvn install -Dmaven.test.skip=true
2.pom中插件全局配置,全部基于该插件目标的任务都会使用此配置,常见的youmaven-compiler-plugin编译java的版本。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin>
3.用户能够为某个插件任务配置特定的参数,将maven-antrun-plugin:run绑定到多个生命周期阶段上,加以不一样的配置
<plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>ant-validate</id> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>validate phase</echo> </tasks> </configuration> </execution> <execution> <id>ant-verify</id> <phase>verify</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>verify phase</echo> </tasks> </configuration> </execution> </executions> </plugin>
能够从http://maven.apache.org/plugins/index.html中查询插件的详细信息,也可使用maven-help-plugin描述插件。
//查询插件信息 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 //查询插件目标信息 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Dgoal=jar-no-fork //查询详细信息 mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Ddetail
Maven内置了一些目录变量,对涉及文件路径的配置会有帮助