maven是什么?

maven主要服务于基于java平台的项目构建、依赖管理和项目信息管理,推崇依赖大于配置的概念。

什么是项目构建?

maven可以自动的进行项目的构建流程,从清理、编译、测试到生成报告,再到打包和部署。这里需要注意的是编写的测试用例,maven会自动运行,出错时打包终止。

什么是依赖管理?

就是你这个项目用到了别人的jar包,在非maven项目中我们需要手动下载并添加jar包到classpath路径下面。而maven使用了中央仓库来提供jar包的下载,并且使用了坐标来唯一表示jar包,并且可以做到父子项目的依赖继承和实现对依赖作用域的管理。

Maven坐标

groupId,组织
artifactId,项目
version,版本号
type,依赖类型,对应于项目坐标定义的packaging,默认为jar
scope,依赖范围
optional,标记依赖是否可选
exclusions

Scope依赖范围

complie

编译依赖范围,默认依赖范围。这个依赖对于complie,test,run三种classpath都有效。

test

测试依赖范围,只对test classpath路径有效。

provided

已提供依赖范围,在complile,test期间有效,在运行期间,由于容器可能已经提供了对应的依赖,就不需要重复导入依赖。

runtime

运行时依赖范围。使用此依赖范围的maven依赖,在complie主代码时无效,这时候只需要知道jdbc接口,比如jdbc驱动,在test和run的时候才会找对于的实现类。

system

系统依赖范围。直接使用了本地系统某个路径下面的jar包,需要指定systemPath元素的值。

import

导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。

image.png

依赖的传递性

传递性依赖

依赖调解

可选依赖

排除依赖

归类依赖

何为maven仓库

maven仓库就是存储依赖的文件目录,使用maven仓库的好处就是在使用时只需要知道对应远程仓库该依赖的坐标,maven就先会在本地仓库中查找是否存在这个依赖。如果不存在的话,就会去对应的远程仓库把依赖下载到本地仓库。使用本地仓库能对依赖进行集中管理,避免依赖分散在不同的项目路径,造成磁盘空间的浪费。

仓库的布局

依赖在仓库目录下面是怎么存放的?对应的denpendency如下图所示

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-beans</artifactId>
  4. <version>${spring-version}</version>
  5. </dependency>

实际的物理路径目录,${repository_path}为本地仓库的路径

${repository_path}/org/springframework/spring-beans/${spring-verison}

仓库的分类

本地仓库

maven会将对应坐标的依赖下载到本地仓库,避免每次构建时都需要去远程仓库下载。

远程仓库

  1. maven默认禁止从远程仓库下载snapshot依赖。需要进行相应的配置。
  1. <profile>
  2. <id>nexus-repository</id>
  3. <activation>
  4. <activeByDefault>true</activeByDefault>
  5. <jdk>1.8</jdk>
  6. </activation>
  7. <properties>
  8. <maven.compiler.source>1.8</maven.compiler.source>
  9. <maven.compiler.target>1.8</maven.compiler.target>
  10. <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  11. </properties>
  12. <repositories>
  13. <repository>
  14. <id>its-snapshots</id>
  15. <name>its-snapshots</name>
  16. <url>http://ip:port/repository/its-snapshots/</url>
  17. <releases>
  18. <enabled>false</enabled>
  19. </releases>
  20. <snapshots>
  21. <enabled>true</enabled>
  22. <updatePolicy>always</updatePolicy>
  23. </snapshots>
  24. </repository>
  25. <repository>
  26. <id>cs-snapshots</id>
  27. <name>cs-snapshots</name>
  28. <url>http://ip:port/repository/cs-snapshots/</url>
  29. <releases>
  30. <enabled>false</enabled>
  31. </releases>
  32. <snapshots>
  33. <enabled>true</enabled>
  34. <updatePolicy>always</updatePolicy>
  35. </snapshots>
  36. </repository>
  37. </repositories>
  38. </profile>

中央仓库

  1. 中央仓库就是maven官网的远程仓库。

Settings文件的优先级

maven工具会默认先去查找对应用户下面的.m2目录下面的settings.xml。如果没有的话,就去M2_HOME\conf目录下面查找settings.xml,如果还没有的话就使用自定义路径下面的settings.xml。

.m2目录

用户范围

maven安装目录(M2_HOME)

全局范围

版本

快照版本(snapshot)

alpha,内测版
beta,公测版
rc,候选版
ga,稳定版

maven生命周期

maven对项目的构建流程进行了统一和抽象,生命周期中每一个步骤都由具体的插件来进行实现。

clean生命周期

default生命周期

site生命周期

maven聚合和继承

在实际项目中一个父项目同时也是聚合项目。

聚合指的是父项目知道有哪几个子项目,但是子项目不知道父项目的存在。通过构建父项目就能构建出所有子项目。

继承指的是子项目继承夫项目的依赖和插件配置,但是父项目不知道被哪几个子项目继承了。依赖继承关系一般用dependencyManagement管理,它在父项目中不会引入实际的依赖,子项目需要某个依赖时,自己去定义,此时不用指明版本号。插件继承关系用pluginManagement管理。

maven插件

插件目标

在指定的maven生命周期阶段phase,来执行插件的某个目标(如antrun插件的run目标)。

插件传参

属性传参:
maven package -Dspring.profile.active=dev

配置文件传参
maven package -Ptest

插件的环境变量

${project.build.sourceDirectory}:项目的主源码目录,默认为 src/main/java
${project.build.testSourceDirectory}:项目的测试源码目录,默认为 src/test/java
${project.build.directory}:项目构件输出目录,默认为 target/
${project.outputDirectory}:项目主代码编译输出目录,默认为 target/classes/
${project.testOutputDirectory}:项目测试代码编译输出目录,默认为 target/test-classes/
${project.groupId}:项目的 groupId
${project.artifactId}:项目的 artifactId
${project.version}:项目的 version,与${version}等价
${project.build.fianlName}:项目打包输出文件的名称。默认为${project.artifactId}-${project.version}

maven-antrun-plugin

配合maven执行一些ant任务,比如说文件的复制操作(将不同环境的配置文件进行复制,感觉还是spring.profile.active好用)。

maven-compiler-plugin

编译Java源码的插件,默认不复制资源文件。

maven-dependency-plugin

用于复制依赖的jar包到指定的文件夹里。将依赖和代码分离,更加方便代码的替换。

spring-boot-maven-plugin

可以使用maven打包springboot项目

maven-jar-plugin

可以将项目打成jar包,不包含依赖,需要配合springboot-depencency使用。

maven-assembly-plugin

可以将项目打包成fat-jar的形式。去掉false

tomcat7-maven-plugin

用于远程部署java项目

已安装插件的定位

默认插件的groupId是org.apache.maven.plugins。插件的定位跟依赖的定位规则一样,区别的地方在于版本号的设置上。

对于核心插件而言,maven内置了核心插件的版本号。如果是非核心插件,maven会根据一定的规则从仓库中取最新的快照或者稳定版本。

推荐书籍

  1. maven实战
  2. Maven权威指南中文版(完整)