Maven-复习笔记
文章目录
一.Maven简介
使用Maven的优点
-
工程和jar包分离
-
自动下载依赖包
maven中央仓库:Maven仓库地址
构建过程
-
清理:清除上一次编译得到的class字节码文件
-
编译:将Java源程序编译成新的字节码文件
-
测试:自动测试,自动调用junit
-
报告:测试程序执行的结果
-
打包:动态Web工程打成war包,Java工程打成jar包
-
安装:Maven特定的一个概念,将打包的到的文件复制到仓库中的指定位置
-
部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行
注意 如果执行后面的命令,会连同前面的命令一起执行
构建顺序 compile→test-compile→test→package→install
二.Maven 的安装
-
安装jdk,配置java环境变量
-
下载解压Maven安装包,非中文,无空格路径
-
配置Maven全局环境变量(如果不想在全局CMD中使用,也可以不配)
MAVEN_HOME: D:\apache-maven-3.6.0 (maven的安装路径)
PATH: MAVEN_HOME\bin
-
在cmd窗口中运行mvn -v 指令查看Maven是否配置成功
三.Maven 的配置
配置阿里云的远程仓库(如果不配置会在官方的默认仓库下载,下载速度一般贼慢):
在setting.xml中<mirrors>
标签内添加:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/groups/public/</url>
</mirror>
四.常用Maven命令
注意
1. 如果没有配置Maven全局环境,就要在Maven的安装目录下,进入CMD执行,如果配置了Maven全局环境,可以在任意目录的CMD下执行
2. 行与构建过程相关的Maven命令(编译,测试,打包),必须进入pom.xml所在的目录
3. 在工程中,如果test中resources中如果没有配置文件,会自动去main中的resources目录下读取
创建Maven项目
mvn archetype:generate
-DgroupId=[groupId]
-DartifactId=[artifactId]
-DarchetypeArtifactId=[项目类型,如maven-archetype-quickstart]
-DinteractiveMode=[false/true] (交互模式)
一键构建项目并执行:
mvn tomcat:run
注意 执行完之后工程的目录多了一个target文件夹
清除编译后的目录(target)
mvn clean
注意 执行之后target目录被删除
编译
mvn compile
注意 生成target目录,只编译main目录下的代码
测试编译
mvn test-compile
注意 生成target目录,只编译test目录下的代码
运行测试代码
mvn test
打包
mvn package
注意 执行完成之后会在target目录下多出一个war包或jar包
注意 如果要打成war包,需要在POM.xml文件中配置打包类型为war
<groupId>com.alasky<groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
发布项目到本地仓库中
mvn install
发布到远程库中:
mvn deploy (需要在POM.xml文件中指定远程库,否则会发布失败)
生成描述文档
mvn site
注意 执行完后在target/site中会有新文件生成
五.POM (Project Object Model 项目对象模型)
六.坐标
使用下面三个向量在仓库中唯一定位一个Maven工程
<groupId>XXX/groupId>
<artifactId>XXX</artifactId>
<version>1.0-SNAPSHOT</version>
-
groupid: 公司或组织域名倒序+项目名
-
artifactid: 模块名
-
version: 版本号
七.仓库
- 本地仓库: 当前电脑上部署的仓库目录
- 远程仓库:
- 私服(Nexus): 大家在局域网环境中,为局域网环境范围的所有Maven工程服务
中央仓库: 架设在Internet上,为全世界所有的Maven工程服务
中央仓库镜像: 为了分担中央仓路的流量,提升用户访问速度
- 私服(Nexus): 大家在局域网环境中,为局域网环境范围的所有Maven工程服务
八.依赖
导入依赖的过程
本地→远程(私服)→中央仓库
依赖的范围 (在pom文件里面配置<scope>
标签)
-
compile: 对主程序和测试程序都有效,参与打包范围
-
test: 对测试程序有效
-
provide: 对主程序和测试程序都有效,但是不参与打包,因为服务器可以提供
注意 比如servlet-api.jar和jsp-api.jar,如果tomcat里面有的jar包,如果在maven里面设置成compile,那么在部署时会出现冲突(工程里面一个,tomcat里面一个)
依赖的传递性
如果A工程依赖B工程,那么如果B工程导入了一个新的依赖,Maven会自动在A工程中也导入这个依赖,但是需要注意,非compile范围的依赖不能传递
依赖的排除
如果某个导入的或者传递过来的依赖出现冲突,或者不想使用,在其父依赖中配置<exclusions>
标签可以将其排除,排除之后也会影响这个依赖的传递性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMGmjiYc-1575542634810)(Maven(一)].assets/1575536685257.png)
依赖的原则
-
如果由于依赖的传递,导致出现不同版本的多个相同的依赖,那么会按照就近原则传递,即只传递上一个工程的依赖版本
例如,下图中,C继承B,B继承A,那么C将会使用B中依赖的版本
-
如果出现两个路径举例相同的依赖,哪个依赖最先声明就使用哪个
如下图,如果A同时继承B和C,如果B在A的pom文件中先声明,A就继承B中依赖的版本
##### 依赖版本的统一
- 使用
<properties>
标签设置一个自定义标签 - 在依赖的版本上使用${自定义标签名}
生命周期
-
各个构建环节按照顺序来执行,不能打乱顺序
构建顺序 compile→test-compile→test→package→install
-
Maven的核心程序中定义了抽象的生命周期,生命周期中的各个阶段的具体任务是由插件来完成的
继承
- 创建一个Maven父工程,打包方式为pom
<groupId>com.abc</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
- 在子工程中声明父工程
<parent>
<groupId>com.abc</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<!--以当前文件为基准的付工程pom.xml文件的相对路径-->
</parent>
-
子工程的依赖坐标中版本标签
<version>
就可以不用写了,(即不指定版本号,默认使用父工程中相同依赖的版本号),如果想用与父工程不同的版本,就再把<version>
标签写上去[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1bOPDSJL-1575542634810)(Maven(一)].assets/1575541625321.png)
注意 如果使用了继承,在安装子工程之前,需要先安装父工程,可以使用聚合来一键安装所有的工程,在聚合工程中(一般是父工程),配置
<modules>
签,其中包括所有的模块
聚合
如果一个项目中包括很多模块,即一个父工程包括很多子工程(模块),那么可以在父工程中使用<modules>
标签将子工程引入,导出时就可以一次将整个项目全部导出
<!--假设一个父工程有3个(ABC)子工程,使用相对路径引入各个子工程-->
<modules>
<module>../A</module>
<module>../B</module>
<module>../C</module>
</modules>