1. Maven定义
Maven 是基于项目对象模型(POM),可以通过一小段描述信息来管理构建、报告和文档的软件项目管理工具。
2.Maven下载和环境变量配置
Maven 官网: http://maven.apache.org/
官网下载: apache-maven-3.5.2-bin.zip
解压这个文件到某一个目录下,配置环境变变量
D:\dev\install\apache-maven-3.5.2\bin
M2_HOME : D:\dev\install\apache-maven-3.5.2
%M2_HOME%\bin
cmd窗口
mvn -v 命令检查环境变量配置
3.Maven 约定的基本目录结构
src/mian/java/package
src/test/java/package
src/resources
pom.xml
4. Maven常用的构建命令
mvn -v 查看maven版本
mvn compile 编译
mvn test 测试
mvn package 打包
mvn clean 删除target
mvn install 把当前项目生成的jar包安装到本地仓库,这样另外一个项目就可以依赖这个项目生成的jar包,只要把这个项目的pom.xml中的坐标添加到另外一个项目的pom.xml中。
PS:maven依赖坐标查找jar的过程 maven -> 本地仓库 -> 中央仓库
5. 自动创建目录骨架
archetype插件用于创建符合maven规定的目录骨架
方式一:在某一个目录下运行该命令:mvn archetype:generate 根据提示输入项目坐标即可创建好项目的目录结构
方式二:
mvn archetype:generate
-DfroupId=组织名,公司网址的反写+项目名称
-DartifactId=项目名-模块名
-Dversion= 版本号
-Dpackage=代码所存在的包名
6. maven中的坐标和仓库
仓库 本地仓库 和 远程仓库
mavne默认配置的中央仓库地址
"D:\dev\install\apache-maven-3.5.2\lib\maven-model-builder-3.5.2.jar"
打开pom-4.0.0.xml可以
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
修改maven中央仓库地址
<mirrors>
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
</mirrors>
修改maven本地仓库路径 (在setting.xml文件中修改)
<localRepository>D:/data/repository</localRepository>
可以把setting.xml文件拷贝到该文件夹下,下次升级maven就不需要修改setting.xml
7. Maven的生命周期和插件
完整的项目构建包括:
清理、编译、测试、打包、集成测试、验证、部署
Maven生命周期
- (1.0)clean 清理项目
pre-clean 执行清理前的工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件 - (2.0) default 构建项目(最核心)
compile /test /package /install - (3.0) 生成项目站点
pre-site 在生成项目站点前要完成的工作
site 生成项目的站点文档
post-site 在生成项目站点后要完成的工作
site-deploy 发布生成的站点到服务器上
ps: 生命周期的各个阶段是独立的,但是在每个阶段的子阶段中 执行后面子阶段的命令,前面的子阶段命令也会执行。
Maven插件的使用
maven插件列表: http://maven.apache.org/plugins/index.html
source插件的使用
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>/absolute/path/to/the/output/directory</outputDirectory>
<finalName>filename-of-generated-jar-file</finalName>
<attach>false</attach>
</configuration>
</plugin>
</plugins>
8. pom.xml解析
<modelVersion> 指定当前pom的版本
<groupId> 反写的公司网址 + 项目名
<artifactId>项目名 + 模块名
<version> 当前项目版本号
<packaging> 默认是jar包,可以指定为war等
<name> 项目描述名
<url> 项目地址
<description> 项目描述
<developers> 开发人员
<licenses> 许可证
<organization> 组织
<dependencies>
<dependency>
<groupId>
<artifactid>
<version>
<type>
<scope> 依赖的范围,默认值 compile
<optional> true/false 设置依赖是否可选, 默认是false, 子项目可以继承该依赖,如果是true,子项目就要显示声明该依赖。
<exclusions>
<exclusion> 排除依赖传递列表
依赖管理, 主要定义在父模块中,供子模块继承,在当前项目中不会运行
<dependencyManagement>
<dependencies>
<dependency>
插件配置
···xml
<build>
<plugins>
<plugin>
<groupId>
<artifactId>
<version>
····xml
<parent></parent>
<
PS:
版本说明 snapshot 快照; alpha 内部测试; beta 公测版本; Release 稳定版本; GA 正式发布
9. 依赖范围
maven 提供了三种的classpath: 编译、测试、运行
<scope> 用来控制依赖和三种classpath的关系
scope的值:
默认是compile 编译、测试、运行都有效;
provided: 在编译和测试时有效;
runtime: 在测试和运行时有效;
test: 在测试时有效;
system: 在编译和测试时有效,但与本机系统相关联,可移植行差;
import: 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置;
10. 依赖传递
依赖传递和排除依赖传递
11. 修改JDK的版本(在settings.xml中增加如下配置)
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<repositories>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compolerVersion>
</repositories>
</profile>
12. 依赖冲突(指的是版本冲突)
规则一: 短路优先
A -> B -> C -> X(v1)
A-> D -> X(v2)
规则二:在路径长度相同时,谁先声明,先解析谁。
A -> B -> X(v1)
A-> D -> X(v2)
此时在A的pom中把B声明在D之前,则引用X(v1)
13. 聚合和继承
聚合
假如 对 多个项目执行install命令,可以新建一个项目,按照如下图配置
继承
假如多个项目中有相同的依赖,可以新建一个项目,按照如下图配置
通过<parent>引用父pom, 同时Junit不用指定版本和范围。