文档章节

可选依赖和依赖排除

AlphaGo
 AlphaGo
发布于 2016/03/25 00:57
字数 829
阅读 50
收藏 2

可选依赖(Optional Dependencies)

        声明可选依赖不只是为了节省空间或内存等,也为了控制需要的实际依赖列表,因为这些依赖jar包最终会被打包成WAR\EAR等,包含错误的jars可能会引起类路径的一些问题。

        在依赖声明中设置<optional>的值为true,就可以将它设为可选依赖。

<dependency>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

        如果A依赖B,当在A的POM中将B声明为可选依赖时,这只是正常的关系:B将被加到A的类路径中。

        现在,又有X依赖于A,这时可选依赖就产生效果了,你会发现在X的类路径中并没有包含B,如果想要包含B,需要直接声明B依赖。


依赖排除(Dependency Exclusions)

        Maven2引入了依赖传递后,使得有可能将不想要的依赖被包含进自己的项目中,比如当你依赖的项目没有正确的声明它们的依赖时。为了解决这个问题,Maven2引入了依赖排除的概念。依赖排除是针对指定groupId和artifactId的依赖设置的。当你构建项目时,该组件将不会被加入类路径中。

        在<dependency>元素下添加<exclusions>子元素表示排除的依赖。

<dependency>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>sample.ProjectB</groupId>
            <artifactId>Project-B</artifactId>
        </exclusion>
    </exclusions>
</dependency>

        

        假设A依赖B和C,B依赖D,D依赖E和F,默认A的类路径中应该包含:B,C,D,E,F

A
   ---> B
      ---> D  <!-- 需要排除D -->
         --->E 
         --->F
   ---> C

        如果我们不想将D和它的依赖被添加到A的类路径中(因为我们知道仓库中可能没有E,而且你不想使用B中依赖于D的某个功能),这时候有两种做法,一是使用上面的可选依赖——让B的开发者将D依赖设置为可选。另一种方式则可以在A这里进行控制:

<dependency>
    <groupId>sample.ProjectB</groupId>
    <artifactId>Project-B</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>sample.ProjectD</groupId><!-- 将D从B中排除 -->
            <artifactId>Project-D</artifactId>
        </exclusion>
    </exclusions>
</dependency>

        

X ---> A

        如果此时将A部署到仓库,X引用A作为依赖,D会从X的类路径中被排除吗?当然,因为A中已经声明不需要D,所以A不会将D传递给X。        

        

X ---> Y
     ---> B
        ---> D

        考虑这样的情况:现在X依赖Y,Y又依赖B,并且它需要D提供的一项功能。那么它不会从依赖列表中排除D。在这种情况下,不全局性的排除D就显得很重要,因为D是Y的一个合法依赖。


A
   ---> B
      ---> D
         --->E  <!-- 排除它 -->
         --->F

        如上所示的一种情况,如果要排除的是E而不是D呢?

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packing>jar</packing>
    
    ...
    
    <dependencies>
        <dependency>
            <groupId>sample.ProjectB</groupId>
            <artifactId>Project-B</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>sample.ProjectE</groupId> <!-- 从B中排除E -->
                    <artifactId>Project-E</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>


        注:依赖排除是以单个依赖为操作基础的,不是POM的全局性设置。

        

        

© 著作权归作者所有

AlphaGo
粉丝 0
博文 9
码字总数 7769
作品 0
程序员
私信 提问
maven依赖总结

1.依赖元素 groupId,必选,实际隶属项目 artifactId,必选,其中的模块 version必选,版本号 type可选,依赖类型,默认jar scope可选,依赖范围,默认compile optional可选,标记依赖是否可选...

dmrs
2015/10/15
30
0
maven依赖总结

1.依赖元素 org.springframeworkspring-core${springframework.version}jarcompile groupId,必选,实际隶属项目 artifactId,必选,其中的模块 version必选,版本号 type可选...

lastsweetop
2013/01/11
0
0
Maven详解(四)依赖中原六合网站开发的配置

依赖的配置中原六合网站开发haozbbs.com Q1446595067 根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有: 依赖范围...

nbzbvzv
2018/07/16
0
0
Maven之Optional 与Exclusions(可选依赖与排除依赖)

1. 场景分析 POM依赖具有传递性性,如下demo所示: 项目A依赖项目B与项目C,项目D依赖于项目E与项目F,默认的话,项目A将依赖于B,C,D,E,F。 2.可选依赖(optional) 假如上述场景中,D中依赖的...

mmss
2017/12/24
0
0
【maven3学习之六】maven中的依赖机制简介

依赖管理是maven的一大特征,对于一个简单的项目,对依赖的管理并不是什么困难的事,但是如果这个项目依赖的库文件达到几十个甚至于上百个的时候就不是一个简单的问题了。在这个时候maven对于...

MyHeaven
2013/01/03
4.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
28分钟前
77
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
38分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
40分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
46分钟前
5
0
Apache Kudu 不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink 进行扩展。 使用的Apache Kudu 的Java 客户端。突然有天发现作业无法提交,一直报错。 后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验...

吐槽的达达仔
56分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部