maven相信大家或多或少都有点知道,但是这玩意到底是干嘛的,需要怎么使用呢,近期一直在看视频以及一些书籍,在这里做个记录,有需要的同学可以共勉
一、作用:
1、管理jar包
a、会帮你自动添加需要的jar包。
b、jar包之间的依赖关系,如果添加的jar包依赖其他jar包的话,你不用声明,它会自动帮你引入,并且不会冲突。
2、将项目拆封成若干模块
a、可以将项目分成多个模块进行开发,然后整合起来,组装成一个大项目。
二、概念
是一个基于java的平台的 自动化构建工具(所以必须要有JDK)
maven 自动化构建的主要工能:
清理:删除编辑的结果,为重新编辑做准备。
编辑:java -> class
测试:单元测试 用测试代码来测试开发代码,针对于 项目中的关键点进行测试。
报告: 测试结果 显示
打包:将项目中包含的多个文件 压缩成一个文件 用于安装或者部署(java->jar web->war)
安装:将打成的包 放到 本地仓库,供其他项目使用(例如当前项目有三个模块,模块2需要模块2的支持,所以需要先将模块1放入到本地仓库中)。
部署:将打成的包 放到 服务器上准备运行。
注:下载一个jar包,先到本地仓库下载,如果不存在,就联网到中央仓库下载。
三、使用
1、下载配置maven 地址:maven.apache.org
2、检查配置JDK环境变量(这里不讲)
3、配置maven环境变量 MAVEN_HOME=解压的文件路径 path=%MAVEN_HOME%\bin
4、验证是不是配置成功: cmd->mvn -v
5、配置本地仓库:在conf->setting.xml中,配置自己的本地仓库,<localRepository>D:/mvnrep</localRepository>
默认本地仓库地址:${user.home}/.m2/repository
maven约定的目录机构
项目
-src
--main 程序功能代码
--java java代码
--resources 资源代码
--test
--java
--resources
-target 源码编译后的结果放到这里
-pom.xml中 项目对象模型(project object model)
pom.xml的文件内容结构
<project>
<modelVersion> 工具eclipse生成以后自带标签,不用管
下面这三个简称 GAV 理解为 坐标 ,根据这三个值可以准确定位到这个 项目
<groupid> 类似于包名 例:com.baidu.maven 域名翻转.大项目名称
<artifactId> 子模块(子项目名称)
<version> 当前模块的版本号
<name> 项目名称 一般来讲,name名和artifactId一致
依赖:比如A中的某些类需要使用B中的某些类,称之为A依赖B,在maven项目中,如果要使用一个当时不存在的jar或者模块,则通过依赖实现
<dependencies>
在https://mvnrepository.com/ 中可以找到各个jar包的gav,直接复制过来就好
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
四、常用命令
注:执行maven 必须在pom.xml所在目录中执行。
第一次执行时,会从本地仓库或者中央仓库中 下载一些 该命令的基础环境,jar包
mvn compile --只编译main目录里面的文件
mvn test 测试
mvn package 打成jar/war
mvn install 将项目放到本地仓库中 ,供其他项目(模块)使用,(放入的位置通过gav决定)
mvn clean 删除target目录,删除 编译文件的目录
五、依赖
<scope>范围:
1、compile(默认): 编译、测试、运行都能拿取到 仓库中的jar包
2、test: 编译、运行都拿取不到jar ,只有测试能拿取到jar包,经典实例:junit,只有在测试时用到。
3、provided:编译、测试能拿取,运行时不能拿取,经典实例:servlet-api.jar,
依赖排除:
例子
A.jar需要B.jar
当我们通过maven引入A.jar的时候,会自动引入B.jar
A.jar(x.java,y.java,z.java) B.jar(p.java,c.java,i.java)
A.jar和B.jar之间的依赖本质:z.java -> c.java
如果我只是 使用了A.jar中的x.java,所以我并不需要B.jar,但是maven自动帮我们引入了,所以这里我们就要依赖排除
使用:
<exclusions>
<exclusion>
这里就是不需要引入的jar包的GA
<groupId>XXX</groupId>
<artifactId>XXXX</artifactId>
依赖传递性:
A.jar -> B.jar —> C.jar
要使 A.jar -> C.jar :当且仅当 B.jar 依赖于 C.jar 的范围是compile
依赖原则:为了防止冲突
1、路径最短优先原则
2、路径长度相同:
a、在同个pom.xml中,有两个相同的依赖,后面覆盖前面(一般严禁这种情况)。
b、如果是不用的 pom.xml中有两个相同的依赖,则先声明的依赖 会覆盖后声明的依赖。
项目之间的依赖:
项目1需要项目2的资源,需要将项目1先install到本地仓库,然后在项目2的pom.xml中写入项目1的 gav
六、生命周期
例如有 a b c d e 五个命令
如果执行c命令,会将a b c全部执行一遍。
包含三个阶段:
1、clean lifecycle :清理
pre-clean clear post-clean
2、default lifecycle :默认
install package compile...等等等等
3、site lifecycle :站点
pre-site site post-site site-deploy
七、统一版本
在pom.xml中
<properties>
//名字随便取
<lanqiao.World.junit.version>4.0</lanqiao.World.junit.version>
然后下面的版本号,直接用这个变量 ${lanqiao.World.junit.version}
八、继承和聚合
继承:
如果A继承B,则 A可以使用B的所有依赖,与 依赖传递性 的区别是 不用管范围是不是compile都会 依赖
例:
1、建一个父工程(打包方式为pom),父工程依赖 需要这样写:
<DependencyManagement>
<dependencies>
<dependency>
2、然后建一个子工程,然后在pom.xml中写:
<parent>
//如果发现父工程和当前的 版本或者包名都是一样的话,可以直接用父工程的
<groupId>
<artifactId>
<version>
//当前pom到父工程pom的相对路径
<relativePath>../B/pom.xml</relativePath>
3、在子类中需要 声明 使用在父类中的多少 依赖
需要在子类的pom.xml中 加入父类对应依赖的 ga 不要 v,如下:
<dependencies>
<dependency>
<groupId>
<artifactId>
聚合:
maven项目能够识别的:自身包含的以及仓库中的资源。
项目1引用项目2,需要先将项目2放入仓库,但是如果有需要项目需要引用的话,不用一个个将项目全部放入仓库,聚合能帮我完成。
使用例子:
在一个总工程(打包方式为pom的工程)中配置:
pom.xml中
<modules>
//这里的顺序没关系,会自动识别。
<module>../maven1 (这里写的是项目pom.xml文件的相对路径)
<module>../maven2
.
.
.