一、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、远程仓库

  maven上传jar到nexus本地仓库

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实战》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. 关于python中str数据类型的内置常用方法(函数)总结

    str基本数据类型常用功能 center(self,width,fllchar=none)                        内容居中,width表示总长度,fllchar表示空白处默认为 ...

  2. 项目启动会(project initiating meeting)与项目开工会(kick-off meeting)区别

    一.项目启动会initiating meeting 召开时间:是启动阶段结束时召开的会议:主要任务:发布项目章程,并任命项目经理,赋予项目经理动用组织资源的权力:注意事项:(1)会议召开前已经对干系人 ...

  3. Spring MVC内容协商实现原理及自定义配置【享学Spring MVC】

    每篇一句 在绝对力量面前,一切技巧都是浮云 前言 上文 介绍了Http内容协商的一些概念,以及Spring MVC内置的4种协商方式使用介绍.本文主要针对Spring MVC内容协商方式:从步骤.原理 ...

  4. C#代码实现IoC(控制反转)设计,以及我对IoC的理解

    一. 什么是IoC 当在A类中要使用B类的时候,我们一般都是采用new的方式来实例化B类,这样一来这两个类就有很强的依赖关系,不符合低耦合的设计思想.这时候我们可以通过一个中间容器来实例化对象,需要的 ...

  5. python 28 网络协议

    目录 网络协议 1. C/S.B/S 架构 1.1 C/S 架构: 1.2 B/S 架构: 2. 网络通信原理 3. OSI七层协议(TCP/IP五层): 3.1 物理层: 3.2 数据链路层: 3. ...

  6. The Best Path(HDU5883)[欧拉路]2016青岛online

    题库链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 欧拉回路裸题,第一次接触欧拉路的我是真的长见识了^-^ 懂了欧拉路这道题就是没什么问题了,欧拉路 ...

  7. Oracle - View

    Oracle View的创建 Create Or Replace View ViewName As Select * From Tables/View Where 条件;

  8. iOS中的几个重要方法

    iOS开发中几个重要的方法: 加载类到内存,程序刚启动的时候调用,调用在main函数之前 1.+(void)load{ } 初始化类,类第一次使用的时候调用一次 2.+(void)initialize ...

  9. E-MAZE_2019牛客暑期多校训练营(第二场)

    题意 给出n行m列的迷宫0可走1不可走,有两个操作,操作1变换点(a,b)的值,操作2查询(1,a)到(n,b)的方案数 题解 设\(F[i][j]\)为第i-1行到达第i行第j列的方案数,若点\(( ...

  10. Codeforces Round #381 (Div. 2) C. Alyona and mex(无语)

    题目链接 http://codeforces.com/contest/740/problem/C 题意:有一串数字,给你m个区间求每一个区间内不含有的最小的数,输出全部中最小的那个尽量使得这个最小值最 ...