maven
Posted FromScratch
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven相关的知识,希望对你有一定的参考价值。
1、环境变量设置M2_HOME--指向Maven安装目录
2、个性设置~/.m2/settings
2.1 复制 M2_HOME下conf下的settings.xml
2.2 设置代理
<settings>
...
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>218.14.227.197</host>
<port>3128</port>
<!--
<username>***</username>
<password>***</password>
<nonProxyHosts>repository.mycom.com|*.google.com</nonProxyHosts>
-->
</proxy>
</proxies>
...
</settings>
3、依赖调解 路径最短/声明优先--解决重复传递依赖的解析问题
3.1 依赖调解(Dependency Mediation)
Maven 引入的传递性依赖机制,一方面大大简化和方便了依赖声明,大部分情况下我们只
需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖。但有
时候,当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖是从哪条依赖
路径引入的。
例如,项目 A 有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X 是 A 的传递性
依赖,但是两条依赖路径上有两个版本的 X,那么哪个 X 会被 Maven 解析使用呢?两个版
本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。Maven 依赖调解
的第一原则是:路径最近者优先。该例中 X(1.0)的路径长度为 3,而 X(2.0)的路径长
度为 2,因此 X(2.0)会被解析使用。
依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A->B->Y(1.0)、A->C->Y
(2.0),Y(1.0)和 Y(2.0)的依赖路径长度是一样的,都为 2。那么到底谁会被解析使
用呢?在 Maven 2.0.8 及之前的版本中,这是不确定的,但是从 Maven 2.0.9 开始,为了
尽可能避免构建的不确定性,Maven 定义了依赖调解的第二原则:第一声明者优先。在依
赖路径长度相等的前提下,在 POM 中依赖声明的顺序决定了谁会被解析使用,顺序最靠
前的那个依赖优胜。该例中,如果 B 的依赖声明在 C 之前,那么 Y(1.0)就会被解析使
用。
3.2 可选依赖
假设有这样一个依赖关系,项目 A 依赖于项目 B,B 依赖于项目 X 和 Y,B 对于 X 和 Y 的
依赖都是可选依赖:A->B、B->X(可选)、B->Y(可选)。根据传递性依赖的定义,如果
所有这三个依赖的范围都是 compile,那么 X、Y 就是 A 的 compile 范围传递性依赖。然
而,由于这里 X、Y 是可选依赖,依赖将不会得以传递,换句话说,X、Y 将不会对 A 有任
何影响。A如果需要,需要显式声明。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
<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>
</project>
以上是关于maven的主要内容,如果未能解决你的问题,请参考以下文章