`

maven日记(二):坐标和依赖

阅读更多

>> maven坐标由5个元素组成:

* groupId:定义当前maven项目隶属的实际项目

maven项目和实际项目不一定是一对一关系,比如SpringFramework这一实际项目,其对应的maven项目会有很多,比如spring-core、spring-context等。这是由于maven中模块的概念,因此一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司,因为一个组织下面会有很多项目。最后,groupId表示方式与Java包名表示方式类似,通常与域名反向一一对应。比如org.sonatype.nexus,org.sonatype是公司域名,而nexus表示Nexus这一实际项目,该groupId与nexus.sonatype.org域名对应。

* artifactId:定义实际项目中的一个maven项目(模块),推荐做法是使用实际项目名称作为artifact的前缀,比如nexus-indexer

* version:定义maven项目当前所处的版本

* packaging:定义maven项目打包方式,默认为jar

* classifier:定义构建输出的一些附属构件,附属构件与主构件对应,如nexus-indexer-2.0.0.jar,该项目可能还会通过使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar等附属构件,这时候,javadoc和sources就是这两个附属构件的classifier。这样,附属构件也就拥有了自己的唯一坐标。注意classifier是不能直接定义的,它是由附加插件帮助生成的。

注:构件生成的文件名规则为:artifactId-version[-classifier].packing,此外,maven仓库的布局也是基于maven坐标。

>> 依赖的配置:

<dependencies>
    <dependency>
        <groupId>com.icegreen</groupId>
        <artifactId>greenmail</artifactId>
        <version>1.3.1b</version>
        <type>...</type>
        <scope>test</scope>
        <optional>...</optional>
        <exclusions>
            <exclusion>
            ...
            </exclusion>
            <exclusion>
            ...
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
    ...
    </dependency>
</dependencies>

每个依赖可以包含的元素有:

* groupId、artifactId和version:依赖的基本坐标

* type:依赖的类型,对应于项目坐标定义的packaging,大部分情况下都为默认的jar

* scope:依赖的范围

* optional:标记依赖是否可选

* exclusions:排除传递性依赖

>> 依赖范围scope

依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,maven有以下几种依赖范围:

* compile:编译范围,如果没有指定,默认就是这个范围,使用此范围的maven依赖,对于编译、测试、运行三种classpath都有效。

* test:测试依赖范围,只对测试classpath有效,在编译主代码或者运行项目的时候无法使用此依赖,典型就是junit

* provided:已提供依赖范围。对于编译和测试有效,但在运行时无效。典型例子就是servlet-api,编译和测试项目时候需要用到该依赖,但在运行项目的时候,由于容易已经提供,就不需要重复的引入了。

* runtime:运行时依赖,对于测试和运行有效。但是编译无效,典型就是JDBC-Driver实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述具体的JDBC驱动。

* system:系统范围依赖。该依赖于三种classpath的关系,和provided完全一致。但是,使用system范围的依赖时候必须通过systemPath元素显示指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而是往往与本机系统绑定,可能造成构建的不可移植,因此谨慎使用,systemPath可以引用环境变量,如:

<dependency>
    <groupId>javax.sql</groupId>
    <artifactId>jdbc-stdext</artifactId>
    <version>2.0</version>
    <scope>system</scope>
    <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

* import:导入依赖范围。该依赖不会对三种classpath产生实际影响

图示说明依赖范围与classpath关系:

依赖范围	compile有效	test有效	runtime有效
compile		Y			Y			Y
test		--			Y			--
provided	Y			Y			--
runtime		--			Y			Y
system		Y			Y			--

>> 传递性依赖

依赖范围不仅可以控制依赖与三种classpath的关系,还对传递依赖产生影响。比如:account-email依赖spring-core,而spring-core依赖commons-logging。account-email对于spring-core的依赖范围是compile,spring-core对于commons-logging依赖范围是compile,那么account-email对于commons-logging这一传递依赖范围就是comile。假设A依赖B,B依赖C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二直接依赖范围决定了传递依赖的范围。

图示依赖范围影响传递依赖:table首列为第一直接依赖,table首行是第二直接依赖,table数据为传递依赖影响范围

1
2
3
4
5
            compile     test    provided    runtime
compile     compile     --      --          runtime
test        test        --      --          test
provided    provided    --      provided    provided
runtime     runtime     --      --          runtime

>> 依赖调解:

如果A -> B -> C -> X1.0,然后还有一个 A -> D -> X2.0,一个项目依赖X的两个版本,那么应该选哪个呢,maven依赖调解原则:

第一原则:路径最近者优先,比如上面,肯定是X2.0路劲优先

第二原则:如果路径长度一样,那么第一声明者优先,也就是在pom的dependence里面优先声明的优先使用。哦也~~

>> 可选依赖

如果A -> B,而B -> X并且 B-> Y,但是如果X和Y是optional的时候,A不依赖X和Y,也就是X和Y不会被传递。

<dependencies>
    <dependency>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <version>1.0.0</version>
        <optional>true</optional>
    </dependency>
</dependencies>

当其他项目需要依赖这个jar包的时候,需要自己去显示的声明。但是在理想情况下,是不应该出现这个传递依赖的。

>> 排除依赖

可以使用exclusion排除传递依赖,不解释

>> 归类依赖

在pom中定义版本变量version,统一使用版本变量名,方便升级,不解释

>> 优化依赖

项目中引入各种依赖的时候,可能会有很多依赖相同的jar包但是版本不一致的,但是maven非常智能的通过它的依赖调解最后确保只会引用唯一一个版本。

可以运行命令 :

mvn dependency:list:去查看当前项目已解析的依赖列表

mvn dependency:tree:以树状结构查看依赖树

mvn dependency:analyze:分析项目的依赖问题

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    深入Maven依赖分析:优化项目依赖的秘诀

    Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...

    深入Maven依赖管理:精通依赖范围的艺术

    Maven工程的构建过程中,真正的jar包存放在仓库中,而项目中仅需放置jar包的坐标信息。这样,当需要引入第三方依赖时,只需在`pom.xml`中添加相应的XML配置即可,简化了版本控制和依赖管理的复杂性。 Maven使用本地...

    Maven的安装包:apache-maven-3.6.1-zip

    Apache Maven 是一个强大的Java项目管理工具,它基于项目对象模型(Project Object Model, POM)的概念,能够自动化构建、依赖管理和项目信息管理。Maven 的核心理念是通过标准化项目结构和依赖管理,简化Java开发...

    maven2gradle:将maven依赖项转换为gradle格式

    Maven是一款由Apache软件基金会开发的项目管理和综合工具,它通过POM(Project Object Model)文件来管理项目依赖,提供了一套标准的构建生命周期。然而,Maven虽然普及度高,但其配置文件XML语法相对复杂,且灵活性...

    解锁Maven的潜能:使用maven-help-plugin获取帮助信息

    Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...

    springboot maven 依赖包3

    springboot 的maven依赖包,含有所有maven依赖,网络不好的可以来下。压缩包3.

    license-maven-plugin:Maven插件,用于从项目依赖项下载和收集许可证文件

    许可证Maven插件 这是 。 发行 确保gpg-agent正在运行。 执行mvn -B release:prepare release:perform 要发布站点,请执行以下操作: cd target/checkout mvn verify site -DperformRelease scm-publish:publish-...

    springboot 的maven依赖包1

    springboot 的maven依赖包,含有所有maven依赖,网络不好的可以来下。

    三. 坐标和依赖

    坐标和依赖”通常指的是在软件开发中管理项目依赖关系的概念,尤其是在Java或Maven等环境中。这里的"坐标"通常是指一个项目依赖的具体版本和它的来源,比如groupId、artifactId和version,这三个元素组合在一起就...

    maven-enforcer:Apache Maven Enforcer(插件)

    Maven Enforcer插件-Maven:trade_mark:的爱铁拳 Enforcer插件提供了控制某些环境约束的目标,例如Maven版本,JDK版本和OS系列以及更多内置规则和用户创建的规则。 文献资料 可以在上找到更多信息。 与Maven ...

    depcheck-maven-plugin:Maven插件可检查已使用的未使用的直接和已使用的间接(传递)依赖项

    实用的插件,用于检查未使用的直接和已使用的间接(传递)依赖项。 用法 通过命令行临时执行 要通过命令行执行此插件的最新版本,请将其更改为maven项目。 “检查-延后” Maven目标 mvn ...

    java-maven-ckfinder-2.3-jar包依赖

    Maven 是一个项目管理工具,用于构建、管理和依赖关系解决。它通过读取项目的 `pom.xml` 文件(项目对象模型)来自动化构建过程,包括编译、测试、打包、部署等。Maven 使用约定优于配置的原则,使得项目构建更加...

    maven_package 依赖包(完整)

    在POM中声明所需依赖,Maven会根据设定的坐标(groupId、artifactId、version)从Maven中央仓库或其他指定的远程仓库下载对应的jar包。例如,`&lt;dependency&gt;`标签用于声明项目依赖,`&lt;dependencies&gt;`标签则用于包含...

    Maven的依赖验证项目

    【Maven的依赖验证项目】是一个关于Maven项目管理和依赖管理的实践案例,它与CSDN博主songdeitao的一篇文章《Maven依赖管理详解》相关联。在这个项目中,我们将深入理解Maven如何处理项目的依赖关系,以及如何有效地...

    探索 Maven 的心脏:深入理解项目对象模型(POM)

    它由 Apache 软件基金会提供支持,用于管理项目构建、依赖和文档等过程。Maven 的设计灵感来源于早期的软件构建工具如 Ant,但它引入了一些新的概念,使得项目构建过程更加简洁和易于管理。 ### Maven 的主要特点:...

    Maven的心脏:深入解析pom.xml的奥秘

    1. **依赖管理**:Maven使用一个中央仓库来管理项目所需的所有依赖,简化了依赖的解析和传递。 2. **项目信息管理**:Maven通过`pom.xml`文件(Project Object Model)来描述项目的基本设置,包括项目依赖、构建配置...

    Maven中的依赖

    7. **依赖管理和继承**:在大型项目中,可以通过创建父POM来集中管理公共依赖和插件,子项目通过继承父POM来继承这些配置。 8. **版本管理和生命周期**:Maven的版本管理允许我们轻松地升级或降级依赖版本。生命...

    Maven配置解码:深入settings.xml与pom.xml的异同

    Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...

    深入Maven插件宇宙:war-plugin与ear-plugin的终极对决

    Maven是一个项目管理和构建自动化工具,主要服务于基于Java的软件项目。它是由Apache软件基金会提供的一个开源工具,使用一种名为Project Object Model (POM) 的XML文件来描述项目的构建过程、依赖关系和其他配置...

Global site tag (gtag.js) - Google Analytics