maven坐标与依赖

坐标

在maven中,任何构件都有明确定义的坐标。这些坐标是通过一些元素定义的,下面是nexus-indexer的坐标定义:

<groupId>org.sonatype.nexus</groupId><artifactId>nexus-indexer</artifactId><version>2.0.0</version><packing>jar</packing>

groupId:定义当前maven项目隶属的实际项目,一般由公司前缀+隶属项目名称组成

artifactId:定义当前maven项目模块,一般由隶属项目名称+当前maven模块名称组成

version:版本号

packing:打包方式。有jar,war等,默认为jar classifier:定义构件输出的一些附属构件。本例主构件输出nexus-indexer-2.0.0.jar,附属构件比如有:nexus-indexer-2.0.0-javadoc.jar,nexus-indexer-2.0.0-source.jar等

依赖配置

除了上面的基本坐标定义,依赖还可以包含:

<project>    ...    <dependency>        <dependency>            <groupId>... </groupId>            <artifactId>... </artifactId>            <version>... </version>            <type>... </type>            <scope>... </scope>            <optional>... </optional>            <exclusions>                <exclusion>                ...                </exclusion>            ...                </exclusions>        </dependency>        ...    </dependency>    ...</project>

type:依赖的类型,对应坐标中的packing,默认为jar,一般不用声明

scope:依赖的范围

optional:标记依赖是否可选,若为true则为可选依赖。可选依赖不能传递

exclusions:用来排除传递性依赖

依赖范围

在一个maven项目中主要有三个classpath:编译classpath,测试classpath,运行时classpath。下表列出了依赖范围和classpath的关系:

依赖范围 (Scope) 对于编译 classpath有效 对于测试 classpath有效 对于运行时 classpath有效 例子
compile spring-core
test × × JUnit
provided × servlet-api
runtime × JDBC驱动实现
system × 本地的,Maven仓库外的 类库文件

compile:编译依赖范围

test:测试依赖范围

provided:已提供依赖范围

runtime:运行时依赖范围

system:系统依赖范围

import:导入依赖范围

传递性依赖

现有pom如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.juven.mvnbook.account</groupId>    <artifactId>account-email</artifactId>    <name>Account Email</name>    <version>1.0.0-SNAPSHOT</version>        <dependencies>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>4.3.3.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>4.3.3.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>4.3.3.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>4.3.3.RELEASE</version>        </dependency>        <dependency>            <groupId>javax.mail</groupId>            <artifactId>mail</artifactId>            <version>1.4.7</version>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.7</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>com.icegreen</groupId>            <artifactId>greenmail</artifactId>            <version>1.5.2</version>            <scope>test</scope>        </dependency>    </dependencies>        <build>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-resources-plugin</artifactId>                <configuration>                    <encoding>UTF-8</encoding>                </configuration>            </plugin>        </plugins>    </build></project>

上面的xml中有一个org.springframework:spring-core.4.3.3.RELEASE.jar依赖。在中央仓库查看其xml,会发现其还包含了:

<dependency>    <groupId>commons-logging</groupId>    <artifactId>commons-logging</artifactId>    <version>1.2</version>    <scope>compile</scope></dependency>

该依赖的范围为compile,而spring-core依赖没有直接声明依赖范围,默认为compile。现在account-email有一个compile范围的spring-core依赖,spring-core有一个compile范围的comms-logging依赖,所以comms-logging会成为account-email的compile范围的传递性依赖

现假设A依赖于B,B依赖于C,那么A相对于B是第一直接依赖,B相对于C是第二直接依赖,A相对于C是传递性依赖,其依赖范围按下表定义:

  compile test provided runtime
compile compile compile
test test test
provided provided provided provided
runtime runtime runtime

表中,第一列是第一直接依赖范围,第一行是第二直接依赖范围,交叉部分是最终传递性依赖范围。

依赖调解

依赖调解有两个原则:

1.路径最近的优先

现在有如下两个依赖:

A → B → C → X(1.0.0)

A → B → X(1.2.1)

A有两个版本的传递性依赖X,因为X(1.2.1)路径较短,所以最终X(1.2.1)会被解析使用。

2.第一声明者优先

现在有如下两个依赖:

A → B → X(1.0.0)

A → B → X(1.2.1)

两个版本X的依赖路径一样长,这时候谁被解析取决于谁先定义!

排除依赖

使用compile:tree查看依赖树:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ account-email ---[INFO] com.juven.mvnbook.account:account-email:jar:1.0.0-SNAPSHOT[INFO] +- org.springframework:spring-core:jar:4.3.3.RELEASE:compile[INFO] |  \- commons-logging:commons-logging:jar:1.2:compile[INFO] +- org.springframework:spring-beans:jar:4.3.3.RELEASE:compile[INFO] +- org.springframework:spring-context:jar:4.3.3.RELEASE:compile[INFO] |  +- org.springframework:spring-aop:jar:4.3.3.RELEASE:compile[INFO] |  \- org.springframework:spring-expression:jar:4.3.3.RELEASE:compile[INFO] +- org.springframework:spring-context-support:jar:4.3.3.RELEASE:compile[INFO] +- javax.mail:mail:jar:1.4.7:compile[INFO] |  \- javax.activation:activation:jar:1.1:compile[INFO] +- junit:junit:jar:4.7:test[INFO] \- com.icegreen:greenmail:jar:1.5.2:test[INFO]    +- com.sun.mail:javax.mail:jar:1.5.6:test[INFO]    \- org.slf4j:slf4j-api:jar:1.7.21:test

如上所述的,spring-core隐式依赖于commons-logging,如果不想传递此依赖,可以为spring-core添加exclusions元素:

<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-core</artifactId>    <version>4.3.3.RELEASE</version>    <exclusions>        <exclusion>            <groupId>commons-logging</groupId>            <artifactId>commons-logging</artifactId>        </exclusion>    </exclusions></dependency>

再次执行dependency:tree命令:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ account-email ---[INFO] com.juven.mvnbook.account:account-email:jar:1.0.0-SNAPSHOT[INFO] +- org.springframework:spring-core:jar:4.3.3.RELEASE:compile[INFO] +- org.springframework:spring-beans:jar:4.3.3.RELEASE:compile[INFO] +- org.springframework:spring-context:jar:4.3.3.RELEASE:compile[INFO] |  +- org.springframework:spring-aop:jar:4.3.3.RELEASE:compile[INFO] |  \- org.springframework:spring-expression:jar:4.3.3.RELEASE:compile[INFO] +- org.springframework:spring-context-support:jar:4.3.3.RELEASE:compile[INFO] +- javax.mail:mail:jar:1.4.7:compile[INFO] |  \- javax.activation:activation:jar:1.1:compile[INFO] +- junit:junit:jar:4.7:test[INFO] \- com.icegreen:greenmail:jar:1.5.2:test[INFO]    +- com.sun.mail:javax.mail:jar:1.5.6:test[INFO]    \- org.slf4j:slf4j-api:jar:1.7.21:test

可发现spring-core已经不依赖于commons-logging了,当然这里只是单纯演示排除依赖,commons-logging对于Spring框架是必须的。

归类依赖

在上述的pom中,spring的版本都为4.3.3.RELEASE版本,而且对于一个框架来说,其各个模块的版本一般都是一样的,这里我们可以统一声明其版本,然后引用即可:

<properties>    <springframework.version>4.3.3.RELEASE</springframework.version></properties>...<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><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context</artifactId>    <version>${springframework.version}</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-context-support</artifactId>    <version>${springframework.version}</version></dependency>

这样在以后更新spring版本的时候,只需要修改properties即可。

优化依赖

除了使用dependency:tree命令外,还可使是dependency:list查看所有依赖:

dependency:list

[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ account-email ---[INFO] [INFO] The following files have been resolved:[INFO]    org.springframework:spring-beans:jar:4.3.3.RELEASE:compile[INFO]    org.springframework:spring-context-support:jar:4.3.3.RELEASE:compile[INFO]    org.slf4j:slf4j-api:jar:1.7.21:test[INFO]    junit:junit:jar:4.7:test[INFO]    com.sun.mail:javax.mail:jar:1.5.6:test[INFO]    com.icegreen:greenmail:jar:1.5.2:test[INFO]    commons-logging:commons-logging:jar:1.2:compile[INFO]    org.springframework:spring-aop:jar:4.3.3.RELEASE:compile[INFO]    javax.activation:activation:jar:1.1:compile[INFO]    javax.mail:mail:jar:1.4.7:compile[INFO]    org.springframework:spring-core:jar:4.3.3.RELEASE:compile[INFO]    org.springframework:spring-context:jar:4.3.3.RELEASE:compile[INFO]    org.springframework:spring-expression:jar:4.3.3.RELEASE:compile

使用dependency:analyze分析依赖:

[INFO] <<< maven-dependency-plugin:2.8:analyze (default-cli) @ account-email <<<[INFO] [INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ account-email ---[WARNING] Unused declared dependencies found:[WARNING]    org.springframework:spring-core:jar:4.3.3.RELEASE:compile[WARNING]    org.springframework:spring-beans:jar:4.3.3.RELEASE:compile[INFO] ------------------------------------------------------------------------

《Maven实战》读书笔记

原文地址:https://www.cnblogs.com/7788IT/p/11625932.html

时间: 2024-12-20 20:21:52

maven坐标与依赖的相关文章

maven in action(四)maven坐标和依赖

坐标(coordinate) 数学课本中的坐标,在平面中的坐标(x,y)能标明平面中的一点,(x,y,z)能找到空间立体中的一点.根据你的身份证地址能找到这个世界上独一无二的你.而在maven中,世界上任何一个构建(jar或者war)都能用maven坐标唯一标识,maven坐标包括groupId.artifactId.version.packaging.classifier.我们提供正确的坐标元素,maven就能找到对应的构建.在上个maven helloworld示例中,我们可以看到pom.x

4.Maven概念模型,maven的生命周期,Maven坐标,依赖管理(依赖范围,依赖声明),仓库管理,私服概念

 1 maven概念模型 2 maven的生命周期,项目构建过程 Maven生命周期就是为了对所有的构建过程进行抽象和统一 包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤 Maven有"三套"相互独立的生命周期,而且相互独立,这三套生命周期分别是: Maven三大生命周期 clean:清理项目的 在进行真正的构建之前进行一些清理工作. default:构建项目的 构建的核心部分,编译,测试,打包,部署等等. site:生成项目站点的 生成项目报告,站点,发布站点 要

(四)《Maven实战》读书笔记 —— Maven坐标和依赖

第四章:坐标和依赖 正如第1章所述,Maven的一大功能是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就是依赖管理的底层基础--坐标. 4.1 何为Maven坐标 关于坐标(Coordinate),大家最熟悉的定义应该来自于立体几何.在一个立体坐标系中,该立体空间内的任何一个点,都能够用坐标(x,y,z)唯一标识.在实际生活中,我们可以将地址看成一种坐标.省市县等一系列信息同样可以唯一标识城市中的任一居住地址,邮局和快递公司正是基于这样一种坐标进行邮件

maven坐标及依赖范围的学习(1)

首先,我们先了解什么是maven的坐标(重中之重): 在这里我们可以看到那三个红色的行,基本是pom.xml中出现的最多的配置     例如这个配置:这里我们可以看到我们这个项目的pom文件中,他对名为(maven-jar-plugin)的插件进行了依赖(dependency,依赖) 同时这个插件的版本为2.4,不过要注意的是,这个插件并不是一加载这个插件就会执行它的任务,因为这个插件要在开发者执行特定的命令后才会执行(关于这些在eclipse里执行maven的命令较为常用的几个,详情见 htt

【Maven】---坐标与依赖

Maven坐标与依赖 最近想深度学习下maven,找到一本书叫<Maven实战>,这本书讲的确实很好,唯一遗憾的是当时maven教学版本是3.0.0的,而目前已经到了3.5.4了,版本存在差距, 没关系,如果有时间和精力我也会阅读官方文档,看看到底有哪些变换. 一.坐标详解 1.何为Maven坐标 maven定义了这样一组规则:世界上任何一个构件都可以使用maven坐标唯一标识,坐标元素包括:groupId.artifactId.version.packaging.classifier.只要提

MANEN坐标与依赖

前言:网上有很多这个例子,讲的也很透彻,但看不如实际敲一遍,加深理解,这里根据步骤一步步进行,只是学习的小过程而已. Coordinate 任何一个构件都可以使用maven坐标唯一标识. 几个关健要素: groupId    artifactId   version   packaging    classifier  maven中央库:http://repo.maven.org/maven2 groupId:项目 通常用域名的反向来表示如:com.help18.hello artifactId

Maven(2)-坐标和依赖

本文简要介绍Maven里面的坐标(coodinate)以及maven依赖管理(Dependency) 一.坐标 先来个截图: 在上图peoject栏目有groupId,artifactId,version,这个就是maven中坐标的概念,这三个属性能够唯一定位一个java架包,其中: groupId代表架包所在的组织(package的概念),比如com.cnblogs artifactId是一个单独架包(项目)的唯一表示 version代表当前项目的版本号 另外坐标还有个packaging属性,

Maven学习笔记之——坐标和依赖(上)

Maven学习笔记之--坐标和依赖(上) 1.    Maven坐标概念 Maven通过构件的坐标来在Maven仓库中定位到具体的构件.Maven的坐标元素包括groupId.artifactId.versiion.packaging.classifier.Maven内置了一个中央仓库地址.需要时Maven会根据坐标到其中下载.具体关于中央仓库的介绍在后面. 2.    Maven坐标详解 比如下面一组坐标: <groupId>org.andy.items</groupId> &l

maven详解之坐标与依赖

看着简单而又复杂的pom.xml文件,看似熟悉,当自己编写的时候觉得简单,但是看人家项目的时候又觉得复杂的很,现在我们一起来分析这个pom文件. Maven的坐标为各种构件引入了秩序,任何一个构件都必须明确的定义自己的坐标,maven的坐标包括如下的元素: groupId: 定义当前Maven项目隶属的实际项目 artifactId: 该元素定义实际项目中的一个Maven项目或模块 version: 该元素定义Maven项目当前所处的版本 packaging: 该元素定义Maven项目的打包方式