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
provided
已提供依赖范围,在complile,test期间有效,在运行期间,由于容器可能已经提供了对应的依赖,就不需要重复导入依赖。
runtime
运行时依赖范围。使用此依赖范围的maven依赖,在complie主代码时无效,这时候只需要知道jdbc接口,比如jdbc驱动,在test和run的时候才会找对于的实现类。
system
系统依赖范围。直接使用了本地系统某个路径下面的jar包,需要指定systemPath元素的值。
import
导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。
依赖的传递性
传递性依赖
依赖调解
可选依赖
排除依赖
归类依赖
何为maven仓库
maven仓库就是存储依赖的文件目录,使用maven仓库的好处就是在使用时只需要知道对应远程仓库该依赖的坐标,maven就先会在本地仓库中查找是否存在这个依赖。如果不存在的话,就会去对应的远程仓库把依赖下载到本地仓库。使用本地仓库能对依赖进行集中管理,避免依赖分散在不同的项目路径,造成磁盘空间的浪费。
仓库的布局
依赖在仓库目录下面是怎么存放的?对应的denpendency如下图所示
<dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring-version}</version></dependency>
实际的物理路径目录,${repository_path}为本地仓库的路径
${repository_path}/org/springframework/spring-beans/${spring-verison}
仓库的分类
本地仓库
maven会将对应坐标的依赖下载到本地仓库,避免每次构建时都需要去远程仓库下载。
远程仓库
- maven默认禁止从远程仓库下载snapshot依赖。需要进行相应的配置。
<profile><id>nexus-repository</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties><repositories><repository><id>its-snapshots</id><name>its-snapshots</name><url>http://ip:port/repository/its-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots></repository><repository><id>cs-snapshots</id><name>cs-snapshots</name><url>http://ip:port/repository/cs-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots></repository></repositories></profile>
中央仓库
- 中央仓库就是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的形式。去掉
tomcat7-maven-plugin
用于远程部署java项目
已安装插件的定位
默认插件的groupId是org.apache.maven.plugins。插件的定位跟依赖的定位规则一样,区别的地方在于版本号的设置上。
对于核心插件而言,maven内置了核心插件的版本号。如果是非核心插件,maven会根据一定的规则从仓库中取最新的快照或者稳定版本。
推荐书籍
- maven实战
- Maven权威指南中文版(完整)
