`
bit1129
  • 浏览: 1068060 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Maven学习笔记四]Maven依赖特性

 
阅读更多

三个模块

为了说明问题,以用户登陆小web应用为例。通常一个web应用分为三个模块,模型和数据持久化层user-core, 业务逻辑层user-service以及web展现层user-web,

user-service依赖于user-core

user-web依赖于user-core和user-service

 

依赖作用范围

 Maven的dependency定义了scope元素,用于控制依赖的部署

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

 

 

 1.compile
    编译范围,默认scope,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效。

   compile表示依赖在编译的时候加载,编译,测试和打包都有效

2.provided
    提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译和测试的classpath中加载和使用,打包的时候不会包含在目标包中。

    最常见的是j2ee规范相关的servlet-api和jsp-api等jar 包,一般由servlet容器提供,无需在打包到war 包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)

    打包的时候无效,编译和测试的时候有效

3.runtime
   一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也 就是说程序只使用了接口,具体的时候可能有多个,运行时通  过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。

   编译时无效,测试和打包的时候有效

4.test
  测试范围,一般是单元测试场景使用,在编译环境加入classpath,但编译mvn compile, 打包mvn package不会加入,如junit,dbunit等。

  只有在编译src/test目录下的类是才会使用scope为test的依赖

  编译和打包无效,测试有效


5.system
   系统范围,与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath 指定本地jar文件路径,所以该scope是不推荐的。如果是基于组织的,一般会建立本地镜像,会把本地的或组织的基础组件加入本地镜像管理,避过使用该 scope的情况。

6.import

 

依赖传递

当在user-service模块的pom.xml文件中添加了对user-core的依赖后,Maven自动将user-core这个模块的pom.xml中声明的依赖加入到user-core的classpath上。注意:添加的依赖只是在user-core中scope声明为compile范围的,其他的范围例如test,则不会进行依赖传递

 

传递依赖版本的选择(Case1)

假如有三个模块A,B和C,以及另一个模块X,例如junit

A依赖于junit的3.8.2版本,B依赖于junit的4.11版本,同时A和B对junit的依赖scope都是compile而不是test(这里仅仅用于说明问题,不必拘泥于这种对junit设置为compile的情况不存在)

 

这种情况常见,比如X模块是log4j,很多模块都会依赖于log4j

 

那么当C依赖于A和B时,A和B依赖的junit都要传递给C,那么最终传递给C的junit究竟是哪个版本?答案是,在C的pom.xml中,如果C直接添加了对X的依赖,那么无视A,B传递过来的X;如果C没有添加对X

的直接依赖,那么A和B依赖的junit都要传递给C,那么最终传递给C的junit究竟是哪个版本?答案是,在C的pom.xml中,先声明对哪个模块依赖,就取那个模块传递的依赖,因此C依赖的junit版本是A传递过来的3.8.2,而不是自作聪明的取B依赖的更高版本4.11

 

C->A->X

C->B->X
在依赖路径相同的情况下,去C中优先声明的那个依赖传递过来的依赖

 

传递依赖版本的选择(Case2)

假如有三个模块A,B和C,以及另外两个模块M,X

A间接依赖于X:A依赖于M,M依赖于X,那么M将X传递给A

B直接依赖于X


那么当C依赖于A和B时,A和B都会把版本X传给C,那么C添加classpath上的X是那个版本呢?不论C的pom文件如何定义对A,B依赖的顺序,C都会加载B传递的依赖,原因是C对X的依赖路径取最短的那个

C->A->M->X

C->B->X

 

传递依赖版本的控制

上面的Case1和Case2是Maven内置的依赖传递特性,通常,我们会有两方面的需求

1.在Case2中,我们不想依赖于B传递过来的X,就是想用A通过M间接传递过来的X

2.我们不希望加载通过传递产生的依赖包

 

Maven提供了在dependency中显式的排除某些包以阻止依赖传递,例如

        <dependency>
            <groupId>a</groupId>
            <artifactId>b</artifactId>
            <version>1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>m</groupId>
                    <artifactId>n</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>x</groupId>
                    <artifactId>y</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

上面从<a,b,1.0>中删除了两个<a,b,1.0>依赖的<m,n>,<x,y>,因为每个模块只能依赖一个版本,因此不需要指定版本

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Maven学习笔记.zip

    **Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程。Maven通过使用一个项目对象模型(Project Object Model,POM),XML格式的配置文件,定义了...

    maven学习笔记

    **Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程...这份"Maven学习笔记"将是你探索Maven世界的宝贵资源,涵盖了从基本概念到高级特性的全方位知识。

    maven学习笔记01(基础入门)

    ** Maven基础入门 ** Maven是一个Java项目管理工具,它主要负责构建、依赖管理和项目信息管理。...在`maven_study_01`的学习笔记中,你可以找到更多关于Maven的基础知识和实践案例,帮助你快速上手并掌握这一工具。

    尚硅谷Maven课程笔记代码资源

    Maven依赖管理的关键在于它的中央仓库,存储了大量的开源库,开发者无需手动下载即可直接引用。此外,还可以设置本地仓库和私有远程仓库,以满足特定项目的需求。Maven通过解析POM文件中的依赖声明,自动从仓库中...

    maven学习笔记.rar

    ** Maven学习笔记详解 ** Maven,作为Java项目管理和构建工具,是开发人员不可或缺的利器。它通过使用一种标准化的项目对象模型(Project Object Model,POM)来管理项目的依赖关系,构建过程以及配置信息。Maven...

    培训机构传出的maven学习笔记

    在“培训机构传出的maven学习笔记”中,我们可能涵盖以下几个关键知识点: 1. **Maven的基本概念**:理解Maven的核心概念,如POM.xml文件、仓库(本地仓库和中央仓库)、生命周期和构建阶段(如clean、compile、...

    Maven 教程:基础篇-尚硅谷学习笔记 2022年

    **Maven教程:基础篇——尚硅谷学习笔记 2022年** Maven是一个强大的Java项目管理和构建工具,由Apache软件基金会开发。它通过提供一个标准的项目对象模型(Project Object Model,POM)来简化项目的构建过程,并...

    mybatis_maven学习笔记

    【mybatis_maven学习笔记】 在Java开发领域,MyBatis和Maven是两个不可或缺的工具,它们分别在数据访问层和项目构建方面扮演着重要角色。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...

    maven学习笔记1

    【Maven学习笔记1】 Maven是一个强大的Java项目管理和构建工具,它可以帮助开发者管理项目的依赖、构建过程、项目信息和报告。本笔记主要涵盖了Maven的基础知识,包括资料收集、安装指南,特别是针对Linux环境下的...

    maven学习笔记,快速入门maven

    内容概要:maven学习笔记,适合刚接触maven的人能让你快速入门。 适用人群:大学生或者初基础maven的人 使用场景及目标:idea集成maven,用来下载依赖包

    个人Maven学习笔记

    ### 个人Maven学习笔记 #### 为什么使用Maven? 在软件开发过程中,尤其是在使用Java进行后端开发时,项目通常会依赖大量的第三方库或框架。如果没有统一的管理工具,这些依赖很容易出现版本冲突的问题,增加了...

    Maven学习笔记

    **Maven学习笔记** Maven是一个强大的Java项目管理和构建工具,它简化了项目的构建、依赖管理和文档生成。本文档基于尚硅谷的视频教程,旨在帮助读者深入理解Maven的核心概念和使用方法。 **1. 为什么学习Maven** ...

    Maven 学习笔记.docx

    【Maven学习笔记】 Maven是一个强大的项目管理和构建工具,主要应用于Java开发领域。它能够自动管理项目的依赖关系,帮助开发者解决因jar包版本冲突、依赖管理混乱等问题带来的困扰。Maven通过制定一套规范化的项目...

    maven项目学习笔记记录

    **Maven项目学习笔记记录** 在软件开发领域,Maven是一个强大的项目管理和构建工具,尤其在Java开发中广泛使用。本笔记将深入探讨Maven的核心概念、主要功能以及实际应用场景,帮助你更好地理解和掌握这一重要工具...

    201205_Maven学习笔记3.rar

    【标题】"201205_Maven学习笔记3.rar"所涵盖的知识点主要集中在Maven的使用和集成上,这是一个关于Maven的详细学习资料压缩包,包含多个文档,帮助用户理解并掌握Maven在实际开发中的应用。Maven是一个强大的Java...

    Maven开发者笔记

    这本书通过一系列逐步讲解的实例,模拟了开发者之间互相学习、交流的过程,让读者能够快速上手并精通Maven。 Maven的核心概念包括项目对象模型(Project Object Model,POM),这是Maven处理项目配置的主要方式。...

    从零开始学maven,maven学习笔记

    Maven 是一个强大的项目管理和构建工具,主要针对Java项目,由Apache公司开发。它基于项目对象模型(Project Object Model,POM),通过POM文件来管理项目的构建...因此,学习和掌握Maven是现代Java开发者的必备技能。

Global site tag (gtag.js) - Google Analytics