Maven基础
1 Maven的作用
随着项目越来越大,要实现的功能越来越复杂我们需要导入的jar包越来越多,所以我们使用Maven来帮助我们来构建jar包和管理依赖。
1.1 Maven的构建
构建指的是使用原材料生产产品的过程,构建过程包含的主要环节有:
- 清理:删除上一次构建的结果,为下一次构建做好准备
- 编译 :Java源程序编译成*.class字节码文件
- 测试:运行提前准备好的测试程序
- 报告:针对刚才测试的结果生成一个全面的信息
- 打包
- Java工程:jar包
- web工程:war包
- 安装:把一个Maven工程经过打包操作生成的jar包或war包安装到Maven仓库
- 部署:将准备好的jar包或war包部署到服务器上运行
1.2 Maven的依赖管理
如果A工程里面用到了B工程的类、接口、配置文件等等这样的资源,那么我们就可以说A依赖B。
依赖管理中要解决的具体问题:
- jar包的下载:使用Maven之后,jar包会从规范的远程仓库下载到本地
- jar包之间的依赖:通过依赖的传递性自动完成
- jar包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
1.3 Maven的工作机制
2 Maven核心概念
2.1 pom文件
<?xml version="1.0" encoding="UTF-8"?>
<!--project 标签:根标签,表示对当前工程进行配置、管理-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- modelVersion 标签:从Maven2开始就固定是4.0.0-->
<!-- 代表当前 pom.xml 所采用的标签结构-->
<modelVersion>4.0.0</modelVersion>
<!--坐标信息-->
<groupId>org.example</groupId>
<artifactId>mavenLearn</artifactId>
<version>1.0-SNAPSHOT</version>
<!--packaging 标签:打包方式-->
<!--取值jar:生成jar包,说明这是一个Java工程-->
<!--取值war:生成war包,说明这是一个web工程-->
<!--取值pom:说明这个工程是用来管理其它工程的工程-->
<packaging>jar</packaging>
<!--properties 标签:在Maven中定义属性值-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<!-- 可以自定义标签-->
<spring-version>4.0.0</spring-version>
</properties>
<!--dependencies 标签:配置具体的依赖信息-->
<dependencies>
</dependencies>
</project>
使用Maven其实就是配置pom文件
2.2 Maven中的坐标
Maven使用三个向量在Maven仓库中唯一定位到一个jar包。
- groupId:公司或者组织的id
- 例如:com.oizys.maven
- artifactId:一个项目或者项目中一个模块的id
- version:版本号
- 例如:SNAPSHOT表示快照版本,正在迭代过程中,不稳定的版本
- 例如:RELEASE表示正式版本
<!-- https://mvnrepository.com/artifact/com.github.tomakehurst/wiremock -->
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock</artifactId>
<version>2.27.2</version>
<type>pom</type>
<scope>test</scope>
</dependency>
2.3 Maven的命令
划分:
1、maven clean:对项目进行清理,删除target目录下编译的内容
2、maven compile:编译项目源代码
3、maven test:对项目进行运行测试
4、maven packet:打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件
5、maven install:在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下
2.4 构建生命周期
为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作
生命周期名称 | 作用 | 各个环节 |
---|---|---|
Clean | 清理操作相关 | pre-clean clean post-clean |
Site | 生成站点相关 | pre-site site post-site deploy-site |
Default | 主要构建过程 | validate generate-sources process-sources generate-resources process-resources 复制并处理资源文件,至目标目录,准备打包。 compile 编译项目 main 目录下的源代码。 process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources 复制并处理资源文件,至目标测试目录。 test-compile 编译测试源代码。 process-test-classes test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 prepare-package package 接受编译好的代码,打包成可发布的格式,如JAR。 pre-integration-test integration-test post-integration-test verify install将包安装至本地仓库,以让其它项目依赖。 deploy将最终的包复制到远程的仓库,以让其它开发人员共享;或者部署到服务器上运行(需借助插件,例如:cargo)。 |
3 Maven的依赖
3.1 依赖的范围
标签位置:dependencies/dependency/scope
可选的值:compile/test/provided/system/runtime/import
main目录(空间) | test目录(空间) | 开发过程(时间) | 部署到服务器(时间) | |
---|---|---|---|---|
compile | 有效 | 有效 | 有效 | 有效 |
test | × | 有效 | 有效 | × |
provided | 有效 | 有效 | 有效 | × |
- compile:通常使用的第三方框架的jar包这样在项目实际运行时真正要用到的jar包都是以 compile 范围进行依赖的。比如SSM框架所需jar包
- test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如junit
- provided:在开发过程中需要用到的"服务器上的jar包"通常以provided范围依赖进来。比如servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:服务器上已经有了,你就别带啦!"
3.2 依赖的传递
在 A 依赖 B ,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。
- B 依赖 C 时使用 compile 范围:可以传递
- B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
3.3 依赖的排除
依赖的排除即阻断依赖的传递性。当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免jar包之间的冲突。
配置方法
<dependency>
...
<exclusions>
<exclusion>
<!--指定需要排除的 jar 包的坐标-->
</exclusion>
</exclusions>
</dependency>
3.4 工程的继承
在父工程中统一管理项目的依赖信息,具体来说是管理依赖信息的版本。通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的jar包;又能够将以往的经验沉淀下来。节约时间和精力
具体操作
-
创建父工程然后修改打包方式为 pom
<groupId>org.example</groupId> <artifactId>maven-parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
-
在父工程中创建子工程并在pom.xml中添加
<modules> <module>pro01-maven-module</module> <module>pro02-maven-module</module> <module>pro03-maven-module</module> </modules>
-
在父工程中统一管理依赖版本
<dependencyManagement> <dependencies> <dependency> ... <version> ... </version> </dependency> ... </dependencies> </dependencyManagement>