《Maven实战》读书笔记
一、Maven使用入门
POM(Project Object Model,项目对象模型),定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等
二、坐标和依赖
1、何为Maven坐标
Maven坐标的元素包括groupId、artifactId、version、packaging、classifier
groupId:定义当前Maven项目隶属的实际项目
artifactId:该元素定义实际项目中的一个Maven项目(模块)
version:该元素定义Maven项目当前所处的版本
packaging:该元素定义Maven项目的打包方式
classifier:该元素用来定义构建输出的一些附属构建
2、依赖的配置
groupId、artifactId和version:依赖的基本坐标
type:依赖的类型
scope:以来的范围
optional:标记依赖是否可选
exclusions:用来排除传递性依赖
3、依赖范围
compile:编译依赖范围,默认依赖范围,对于编译、测试、运行三种classpath都有效
test:测试依赖范围(JUnit)
provided:已提供依赖范围(如容器依赖servlet-api)
runtime:运行时依赖范围(如JDBC驱动)
system:系统依赖范围(需显式指定依赖文件路径systemPath,用于Maven仓库之外的类库文件)
import:导入依赖范围
4、传递性依赖
当第二直接依赖的范围是complie的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递依赖的范围同样为provided;当第二直接依赖的范围是runtime的时候,传递依赖的范围与第一直接依赖的范围一致,单compile例外,此时传递性依赖的范围为runtime
如果第一直接依赖、第二直接依赖和传递性依赖的范围一致,又叫范围传递性依赖
5、依赖调解
依赖调解第一原则:路径最近者优先,依赖关系最短的被解析使用
依赖调解第二原则;在依赖路径长度相等的前提下,在POM中依赖声明的顺序靠前的优先
6、可选依赖
只用于当前项目的依赖,不会被传递
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.4-701.jdbc3</version>
<optional>true</optional>
</dependency>
</dependencies>
比如持久层工具包项目B,支持多种数据库,项目A在使用这个工具包的时候,需要显示声明对mysql-connector-java或project-b的依赖
7、排除依赖
传递性依赖会给项目隐式地引入很多依赖,有时候会带来问题。
例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目。这时就需要排除掉该SNAPSHOT,并且在当前项目中声明该类库的某个正式发布的版本
还有一些情况,你可能想要替换某个传递性依赖,比如某个类库A不在中央仓库,而另一个类库B有对应的实现,就可以排除A再声明B
<dependencies>
<dependency>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>porject-b</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-c</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-c</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
使用exclusions和子元素exclusion可以排除一个或者多个传递性依赖,声明exclusion的时候只需要groupId和artifactId,而不需要version
8、归类依赖
可以在唯一的地方定义版本,并且在dependency声明中引用这一版本
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
三、仓库
1、仓库的分类
本地仓库和远程仓库,Maven会优先从本地仓库寻找构建,如果不存在就去远程仓库寻找,发现后下载到本地仓库再使用
远程仓库还分中央仓库、私服和其他公共库,中央仓库是Maven核心自带的远程仓库,包含了绝大部分开源的构件,私服是自己架设的私有的仓库服务器
Install插件的install目标将项目的构建输出文件安装到本地仓库
2、私服
节省自己的外网带宽
加速Maven构建
部署第三方构建
提高稳定性,增强控制
降低中央仓库的负荷
3、远程仓库
4、快照
版本号以SNAPSHOT作为后缀,可以多次发布,maven会自动在版本号最后加上时间戳,依赖这个包的项目只要mvn clean install-U就可以取到最新版本的包
5、镜像
相当于一个拦截器,把匹配到的发往中央仓库的请求转发到镜像仓库,一般配置阿里云的镜像可以显著提高下载速度,也有把私服作为镜像配置
镜像仓库是完全屏蔽被镜像仓库的,镜像仓库无法服务的时候,将无法下载构件
四、生命周期和插件
1、三套生命周期
clean生命周期
default生命周期
site生命周期
2、命令行与生命周期
$mvn clean
$mvn test
$mvn clean install
$mvn clean depoy
五、聚合与继承
1、聚合
为了一次构建多个项目,而不是到个个模块的目录下分别执行mvn命令
<modules>
<module>acount-email</module>
<module>acount-persist</module>
</modules>
2、继承
为了消除重复的配置
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<packaging>pom</packaging>
</parent>
《Maven实战》读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级
标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...
- .net core 实现 api网关 进行 api版本控制
场景: 由一次大的项目改动引起的app端api不兼容问题,这时候就需要对api做版本控制了,权衡之后因为用户不多,选择了强更,没人想在已经写了8000行代码的单个svc文件中维护好几个版本的接口或者继 ...
- 记录一则DG遭遇ORA-00088的案例
测试环境:RHEL 5.4 + Oracle 11.2.0.3 DG 现象:起初是在使用DG Broker进行switchover切换测试时,报错ORA-16775,提示有可能有数据丢失,不允许swi ...
- odoo通过actions.client进行自定义页面
一.使用原因 由于odoo自带页面在项目开发过程中无法满足使用,需要使用到动作ir.actions.client进行自定义视图的开发,实现自定义的xml视图开发. 二.实现目标 三.开发过程 1.项目 ...
- Spring学习之旅(九)--SpringMVC高级技术
文件上传 在 Web 应用中,允许用户上传文件是很常见的需求.文件上传通常是采用 multipart 格式,而 DispatcherServlet 并没有任何解析 multipart 请求数据的功能, ...
- PHP CURL根据详细地址获取腾讯地图经纬度
<?php $address = "广东省广州市天河区"; $point = getPoint($address); var_dump($point);//输出经纬度 /** ...
- 如果使用tf::transform进行简单的不同frame间的pose转换
tf转换,分为两部分:broadcaster和listener.前者是tf的发布者,后者是接收者.我们如果要建立一个完整的tf体系,需要自己先生成tf信息用broadcaster发布出去,然后再在需要 ...
- CF Edu54 E. Vasya and a Tree DFS+树状数组
Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...
- Prim && Kruskal
Electrification Plan Prim #include<iostream> #include<cstring> using namespace std; cons ...
- CodeForces 1082 G Petya and Graph 最大权闭合子图。
题目传送门 题意:现在有一个图,选择一条边,会把边的2个顶点也选起来,最后会的到一个边的集合 和一个点的集合 , 求边的集合 - 点的集合最大是多少. 题解:裸的最大权闭合子图. 代码: #inclu ...