近期学习SpringBoot源码,试着搭建了一下源码工程,但老是失败,各种maven报错。所以特地来学习了maven基础知识,记录一下,好以后翻。
maven是一个强大的构建工具,能够帮助我们完成自动构建过程:清理,编译,测试,生成测试报告,打包和部署。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <groupId>org.springframework.boot</groupId> <!-- 组 --> 6 <artifactId>spring-boot-cli</artifactId> <!-- ID --> 7 <version>${revision}</version> <!-- 版本号 --> 8 <package>jar</package> <!--打包方式,默认是jar --> 9 <name>Spring Boot CLI</name> <!--名字,便于辨识 --> 10 <description>Spring Boot CLI</description> 11 <dependencies> 12 <!-- 引入依赖 --> 13 <dependency> 14 <groupId>org.springframework.boot</groupId> 15 <artifactId>spring-boot-loader-tools</artifactId> 16 <version>4.7</version> 17 <type></type> <!-- 引入的依赖类型 --> 18 <scope>test</scope> <!-- 引入依赖 --> 19 <exclusions></exclusions> <!-- 用来排除传递性的依赖 --> 20 </dependency> 21 </dependencies> 22 </project>
依赖范围(scope):在maven编译代码时,是需要使用一套classpath的。故,maven在编译不同的scope时,是使用不同的classpath来达到此目的的,共有编译,运行,测试三种。
scope | 传递依赖 | 释意 |
compile | 是 | 默认,范围最广 |
test | 否 | 测试用到 |
provided | 否 | 在compile和test scope内有效,runtime无效 |
runtime | 是 | test和runtime 的scope有效,compile无效(目前还不太理解) |
system | 是 | 系统以来(目前还不太理解) |
当A引用B,B引用来C,那么相当于A引用了C(test和provided scope内不会传递)。 传递原则:路径最近者优先,第一声明者优先。
如: A 》B》C》D
B》D
A会优先引用B依赖的D
使用 mvn dependency:list / tree) 可以展示所有的依赖关系(在pom文件所在的目录执行该命令就可以)。可以利用该命令行来提供公共的jar包,提取到一个pom文件中
maven的生命周期总共有三个,类似于三个流程,但是他们都是相互独立的:clean;default;site。每个周期下都有自己的阶段。他们都是抽象的步骤(类似模板方法),具体动作都是由插件完成的。
clean:清理项目
阶段 | 释义 |
pre-clean | 执行清理前要完成的工作 |
clean | 清理上一次构建生成的文件 |
post-clean | 执行一些清理后需要完成的动作 |
default:构建项目,有好多步骤
阶段 | 释义 |
validate | |
initialize | |
generate-source | |
process-source | |
generate-resource | |
process-resource | |
compile | 编译 |
process-classes | |
generate-test-sources | |
process-test-sources | |
generate-test-resource | |
... ... .. |
|
test-compile | |
process-test-classes | |
test | 跑单元测试 |
prepare-package | |
package | 打包 |
... | |
install | 安装包到maven本地仓库,共本地其他的maven项目使用 |
deploy | 将最全的包复制到远程仓库,供其他人员使用 |
site:构建项目站点
暂时不理解干嘛,也还没有用到过
maven的每个生命周期都是相对独立的,但每个生命周期内部的每个阶段都是由强依赖关系的,如下列例子:
命令 | 解释 |
mvn clean | 调用clean生命周期中的clean阶段。实际上他执行了pre-clean,clean两个阶段 |
mvn test | 该命令调用的是default生命周期的test阶段。实际上它执行了validate、initlize...compile...test的所有阶段 |
mvn clean install | 该命令执行了两个生命周期中的clean和install之前的所有阶段 |
当你有A,B两个模块时。你想要同时构建打包它们,以往你需要分别到两个模块下,分别打包。maven提供的聚合功能,可以一次性打包。你可另外在创建一个模块C(空白项目),然后在C模块的POM文件中将A、B聚合。
<modules> <module>A</module> <!-- 平级目录 --> <module>./B</module> <!-- 上级目录 --> </modules>
注意点:
当一个项目有多个模块时,每个模块的项目可能会引入相同的依赖,此时就可以声明一个parent模块(空白项目),将多次引用的依赖,放在parent模块的pom中声明,由子模块来继承。子模块pom文件引入:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-parent</artifactId> <version>${revision}</version> <relativePath>../spring-boot-parent</relativePath> </parent>
注意记得也要将parent模块引入聚合模块中
当我们各个模块的功能越来越丰富,引入的依赖也慢慢变多,每个模块的依赖也会不尽相同。若还是简单的直接使用继承关系,会造成无差别继承(即子模块只用到父pom文件中的部分依赖)。此时我们可以在父POM文件中,引入依赖时使用<dependencyManagement>标签,在该元素下的依赖不会引入实际的依赖。
即在使用时,在父POM文件中使用<dependencyManagement>标签声明所有模块需要的依赖、版本信息等,做一个统一管理。然后在子模块的POM文件中,只需要声明需要需要哪些依赖(不用再声明版本等信息了,在父POM文件中统一管理了)。
<!-- 父POM文件用dependencyManagement标签管理 -->
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test-support</artifactId> <version>${revision}</version> </dependency> </dependencyManagement>
<!-- 子模块POM只需声明要那些依赖 -->
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> </dependencies>
原文:https://www.cnblogs.com/longshun/p/14655944.html