1、maven简介
什么是maven
主要服务于java平台的项目构建,依赖管理和项目信息管理。
什么是构建
除了编写代码,我们还需要编译、运行单元测试、生成文档、打包和部署等繁琐且不起眼的工作上,这就是构建。
maven的优势
1、跨平台。
2、服务于构建,能帮我们自动化构建过程,从清理、编译、测试,到生成报告,再到打包和部署。
3、标准化
maven能帮助我们标准化构建过程。在maven之前,10个项目可能有10种构建方式,有了maven后,所有项目的构建命令都是简单一致的,这极大避免了不必要的学习成本,而且有利于促进项目团队的标准化。
4、依赖管理工具
maven为java开发者提供了中央仓库,每个jar包都有唯一确定的标识。
学习maven的资料
许晓斌 maven书籍
安装配置好maven后,一般只需要修改settings.xml文件的本地仓库的地址<localRepository>D:/maven/repository</localRepository>
pom文件中的 scope 作用范围
<scope>test</scope>
仓库分为:
- 中Yang仓库:包含了大部分的jar包
- 本地仓库
- 私服
maven的本地仓库:
- 默认:C盘—.m2—repository
- 设置:settings.xml
<localRepository>
标签
2、版本号
- X.X.X-里程碑
- 第一个X:大版本,有重大变革
- 第二个X:小版本,修复bug,增加功能
- 第三个X:更新
- 里程碑:snapshot(快照,开发版)
- alpha:内部测试
- beta:公开测试
- release:发布版,release candidate
- GA:正常版本
3、jar 包的坐标详解
- groupId(组织):定义项目属于哪个组,这个组往往和所在的组织和公司存在关联
- artifactId(项目):定义maven项目在组中唯一的id,比如spring-aop
- version:定义maven项目当前所处的版本
- packaging:定义maven项目的打包方式,打包方式通常与所生成构建的文件扩展名对应,maven默认的打包方式是jar,也可以是war
- classifier:定义构建输出的一些附属构件,比如javadoc和sources.jar,这是java文档和源代码
4、mvn命令
-
mvn -v
-
创建maven的普通java项目
mvn archetype:create -DgroupId=packageName -DartifaceId=projectName
-
创建maven的web项目
mvn archetype:create -DgroupId=packageName -DartifaceId=webappName -DarchetypeArtifactId=maven-archetype-webapp
-
编译源代码
mvn compile
- 下载jar包,先在本地仓库中查找有没有jar包,没的话,去远程仓库(私服、中Yang仓库)中下载
- 产生target文件夹,.java文件compile后生成的.class文件
-
编译测试代码
mvn test-compile
-
运行测试
mvn test
-
产生site
mvn site
-
打包
mvn package
-
在本地仓库中安装jar
mvn install
-
清除产生的target文件夹
mvn clear
-
生成idea项目
mvn idea:idea
-
只打包不测试
mvn -Dtest package
-
编译测试的内容
mvn test-compile
-
只打jar包
mvn jar:jar
-
只测试,不编译,也不测试编译
mvn test -skipping compile -skipping test-compile
-
mvn clear:清除target
-
mvn test:测试用例是否成功
-
mvn clear test:清除target后,test
-
mvn package:把项目打包成jar包
-
mvn clean install:清除target后,生成jar包,然后把jar安装到本地仓库
- build
- test
- jar
5、依赖
依赖范围是用来控制依赖与这3种classpath(编译classpath、测试classpath、运行时classpath)的关系,maven有以下几种依赖范围:
- compile:编译依赖范围,如果没有指定,默认使用该依赖范围,对于编译、测试、运行都有效
- test:测试依赖范围,只在测试的时候需要,比如:junit
- provided:已提供依赖范围,使用此依赖范围的maven依赖,对于编译和测试有效,运行时无效。典型例子 servlet-API,编译和测试项目需要,但是运行项目时,由于容器已经提供,就不需要maven重复地引入一遍
- runtime:运行时依赖范围,对于测试和运行有效,对于编译无效,典型例子 jdbc 驱动程序,项目代码的编译只需要 jdk 提供的 jdbc 接口,只有在测试和运行时才需要实现上述接口的具体 jdbc 驱动
- system:系统范围依赖,一般不适用
依赖传递性:
传递依赖机制,让我们在使用某个 jar 的时候,就不用去考虑它依赖了什么,也不用担心引入多余的依赖,maven 会解析各个直接依赖的pom,将那些必要的间接依赖,以传递依赖的形式引入到当前项目中。
传递依赖可能有冲突:
- 冲突场景1:
- a–>b–>c(1.0)
- a–>f–>c(2.0)
如果 a 下同时存在两个不同 version 的 c,冲突!
解决办法:第一声明者优先
- 冲突场景2:
- a–>b–>c–>d(1.0)
- a–>f–>d(2.0)
解决办法:路径最近者优先
- 冲突场景3:如果pom文件中,引用了2和不同版本的jar包,那么第二个会覆盖掉第一个
其他解决冲突的方法:排除依赖
6、聚合和继承
聚合和继承的packaging都是pom <packaging>pom</packaging>
聚合:就是把多个artifactId统一放到聚合项目中,当执行clean、compile、install、package等命令时,所有的 artifactId 都会执行