《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高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- 如何使用WorkManager执行后台任务(上)
0x00 简述 WorkManager 是 Android Jetpack中的一部分,它主要是封装了 Android 后台任务的调度逻辑.在前文<Android后台任务处理指南>一文中知道 ...
- 01 Python网络爬虫简介
什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后去互联网上爬取/获取数据的过程. 爬虫的分类 - 通用爬虫:就是爬取互联网中的一整张页面内容. - 聚焦爬虫:根据指定的需求爬取页面中指定的局部内容 ...
- Mybatis的一级缓存和二级缓存的理解以及用法
程序中为什么使用缓存? 先了解一下缓存的概念:原始意义是指访问速度比一般随机存取存储器快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术.对于我们编程来说,所谓的 ...
- ECMAScript---布尔类型、null、undefined详解
布尔类型中 至只有 true和false 在开发中它是非常重要的两个值,尤其是在条件判断中 如何把其他类型转换为布尔类型? 1.Boolean() Boolean(1); //true Boolean ...
- CentOS -- Zookeeper installation and configure
1 JDK 1.8 must installed first 2 Get Zookeeper package wget https://archive.apache.org/dist/zookeepe ...
- JS实现停留几秒sleep,Js中for循环的阻塞机制,setTimeout延迟执行
//第一种,使用while循环 function sleep(delay) { var start = (new Date()).getTime(); while((new Date()).getTi ...
- 通过代码审计找出网站中的XSS漏洞实战(三)
一.背景 笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘.工具挖掘.代码审计三部分内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联性,其中手工XSS挖掘篇地址为 ...
- 2019DX#2
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Another Chess Problem 8.33%(1/12) 1002 Beau ...
- 【Edu 67】 补题记录
CF1187D. Subarray Sorting 想要把一个数x换到前面,x一定是小一点的值.由于B串是固定的,A串可调整,我们可以遍历B数组,对于B[i],找到对于在A数组的位子pos,判断1-p ...
- codeforces 862 C. Mahmoud and Ehab and the xor(构造)
题目链接:http://codeforces.com/contest/862/problem/C 题解:一道简单的构造题,一般构造题差不多都考自己脑补,脑洞一开就过了 由于数据x只有1e5,但是要求是 ...