maven的依赖与依赖的高级

本文主要的内容是依赖的范围、依赖的传递性和依赖的排除

依赖的范围

依赖的范围:采用<dependency>声明的依赖可以通过<scope>的值来确定可以使用依赖的范围。并不是只要在<denpendcy>中声明的依赖就能处处使用。

范围的标签是:<scope>默认值是compile。下表是依赖的三个scope的值以及使用的范围。

 

在主程序中是否可用

在测试程序中是否可用

是否参与打包

 

test

跟单元测试相关的依赖,比如junit

compile

绝大多数依赖

provided

web服务器已经提供的依赖比如:servlet和jsp

依赖的传递性

假设A、B、C是三个maven项目,其中A依赖于B,B依赖于C。那么即使在A项目的pom.xml文件中没有明确的说明对于C的依赖,A项目也是依赖与C的,且这样的依赖可以无限传递。

根据依赖的传递性可以得出的结论是,通常情况可以在项目中设置公共工程commons并且声明所有工程都需要的公共依赖,这样可以减少项目的配置。

需要注意的是,依赖只能传递范围为compile的依赖,其他范围的依赖不能通过这样的方式来进行传递。

依赖的排除性

依赖的排除:由于依赖的传递性是maven的默认行为,有时需要排除传递来的依赖

例如A同时依赖于M和N。而M、N同时又依赖于D,且两个D的版本不同,这时对A中依赖的两个D的版本不一致会产生依赖冲突,导致构建失败,这时就需要进行依赖的排除。

依赖的排除又两种方法。

方式一,在声明依赖处使用标签<exclusions>进行依赖的排除,适合单处排除

<dependency> 
    <groupId>org.example.maven</groupId> 
    <artifactId>maven-dependencied</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <exclusions> 
        <!--排除来自maven-dependencied中关于log4j的依赖--> 
        <exclusion> 
            <groupId>log4j</groupId> 
            <artifactId>log4j</artifactId> 
        </exclusion> 
    </exclusions> 
</dependency>

 

方式二,在原声明依赖处排除,适合多处依赖排除使用<optional>

<dependencies> 
    <dependency> 

        <groupId>log4j</groupId> 
        <artifactId>log4j</artifactId> 
        <version>1.2.12</version> 
        <optional>true</optional><!--表示这个依赖只在这一处使用,不进行依赖的传递-->                           

    </dependency>
</dependencies>

 

关于依赖的冲突maven也提供了自己默认的解决冲突的原则,但是并不推荐使用。

  1. 最短路径原则:路径不一样的时候取最短路径
  2. 路径一样的时候,最先声明原则。取先声明的依赖

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值