• Maven 依赖范围、传递、排除,你确定你都清楚吗?


    今天讲讲如何管理依赖,及依赖的范围、传递性等特征。

    添加依赖

    下面我添加了一个spring-web的依赖,maven就会去下载spring-web的jar包及它依赖的一些jar包。

    <dependencies>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-web</artifactId>
    		<version>4.2.5.RELEASE</version>
    		<scope>compile</scope>
    	</dependency>
    </dependencies>
    

    依赖范围

    依赖配置中有一个scope之前没讲过,它就是依赖范围。什么是依赖范围就是指定你这个jar包在哪个阶段时才有效。

    • compile - 编译依赖范围。默认的范围,可以不填,表示在所有过程中都有效,如编译期、测试过程中、运行期间等。

    • provided - 已提供依赖范围。这个范围表示只提供编译和测试阶段有效,运行期间不需要,像tomcat等容器本身已经提供的servlet-api等。

    • runtime - 运行时依赖范围。这个范围表示只有在运行和测试期间才有效,编译期间不需要,像连接数据库的jdbc驱动程序等。

    • test - 测试依赖范围。这个范围只有测试阶段有效,编译和运行不需要,像单元测试提供的junit包。

    • system - 系统依赖范围。这个范围表示不依赖本地仓库,jar在其他的目录,需要通过systemPath指定路径,这个不建议使用。

    • import - 引用依赖范围。Maven2.0.9之后新增的范围,只能用在中,并且导入的type为pom类型的父工程配置,一般用来解决多继承问题。

    依赖传递

    依赖的传递前面讲过通过继承和聚合的方式可以达到,通过继承的方式可以轻松的从父项目继承过来,通过聚合的方式也可以间接的传递过来。

    继承:A继承B,A就可以继承B的dependencies依赖。

    聚合:A依赖C,C依赖D,那么A就要依赖D自然也就获取了D的依赖。

    下面这是dubbo的直接依赖和所有间接依赖的关系列表。

    依赖排除

    在依赖传递过程中,如A依赖B、S2.0,B依赖C、S1.0,这样A就有了S1.0和S2.0两个依赖,这样某些情况下会造成冲突需要手动把B间接传递过来的依赖排除掉,就是不依赖B带过来的S1.0的包。

    <dependency>
    	<groupId>org.testgroupId>
    	<artifactId>B</artifactId>
    	<version>1.0</version>
    	<exclusions>
    		<exclusion>
    			<groupId>com.test</groupId>
    			<artifactId>S</artifactId>
    		</exclusion>
    	</exclusions>
    </dependency>
    

    排除所有间接依赖

    <dependency>
    	<groupId>org.testgroupId>
    	<artifactId>B</artifactId>
    	<version>1.0</version>
    	<exclusions>
    		<exclusion>
    			<groupId>*</groupId>
    			<artifactId>*</artifactId>
    		</exclusion>
    	</exclusions>
    </dependency>
    

    推荐去我的博客阅读更多:

    1.Java JVM、集合、多线程、新特性系列教程

    2.Spring MVC、Spring Boot、Spring Cloud 系列教程

    3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

    4.Java、后端、架构、阿里巴巴等大厂最新面试题

    觉得不错,别忘了点赞+转发哦!

  • 相关阅读:
    正则表达式(转)
    Java实现的具有GUI的校园导航系统
    由“哥尼斯堡的‘七桥问题’”引出的并查集问题
    Is It A Red-Black Tree?(判断一棵树是否为红黑二叉树)
    Java IO
    Android ORMLite的使用
    Android SQLite数据库的数据升级与降级
    Android SQLite数据库 SQLiteOpenHelper的操作使用
    SimpleAdapter与baseAdapter的使用语法与区别
    Android五大布局之一绝对布局(AbsoluteLayout)
  • 原文地址:https://www.cnblogs.com/javastack/p/13029052.html
Copyright © 2020-2023  润新知