`

Maven实战(一)—— 依赖

 
阅读更多

依赖配置:

例如:

  1. <project>  
  2.   ...  
  3.   <dependencies>  
  4.     <dependency>  
  5.       <groupId>group-a</groupId>  
  6.       <artifactId>artifact-a</artifactId>  
  7.       <version>1.0</version>  
  8.       <exclusions>  
  9.         <exclusion>  
  10.           <groupId>group-c</groupId>  
  11.           <artifactId>excluded-artifact</artifactId>  
  12.         </exclusion>  
  13.       </exclusions>  
  14.     </dependency>  
  15.     <dependency>  
  16.       <groupId>group-a</groupId>  
  17.       <artifactId>artifact-b</artifactId>  
  18.       <version>1.0</version>  
  19.       <type>bar</type>  
  20.       <scope>runtime</scope>  
  21.     </dependency>  
  22.   </dependencies>  
  23. </project>  

 

依赖会包含基本的groupId, artifactId,version等元素,根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个依赖。每个依赖可以包含的元素:

 groupId、artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。 

 type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。

 scope:依赖的范围,下面会进行详解。 

 optional:标记依赖是否可选。 

 exclusions:用来排除传递性依赖。     

 

依赖传递:

依赖是会被传递的,例如:A-->C B-->A ==>B-->C(这种依赖是基于compile这个范围进行传递),

在dependency配置中如果没有写scope默认就是compile范围,依赖的传递主要是针对compile作用域。

 

依赖范围:

      compile:编译范围。默认的依赖范围,指的是编译范围有效,在编译和打包时都会将依赖存储进去;

      provided:可提供范围。范围指的是在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突;

      test:测试范围。范围指的是测试范围有效,在编译和打包时都不会使用这个依赖;

      runtime:运行时范围。在运行的时候依赖,在编译的时候不依赖。

      system:系统范围。provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径,同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

 

依赖冲突:

     1、如果a依赖于b的1.0版本,c依赖于b的1.1版本,d依赖于a和c,这时在d的pom中哪一个依赖先写就使用先写依赖的版本。

     2、如果a依赖于b的1.0版本,c依赖于b的1.1版本,d依赖于a和c,f依赖于d和c,依赖的路径的长短不一致就选择最小的。

     3、如果希望精确的控制依赖包,可以使用依赖的排除功能——> exclusions来排除。

 

可选依赖:

       有时候我们不想让依赖传递,那么可配置该依赖为可选依赖,将元素optional设置为true即可,例如:

<dependency>

  <groupId>commons-logging</groupId> 

  <artifactId>commons-logging</artifactId> 

  <version>1.1.1</version> 

  <optional>true<optional>

</dependency>

那么依赖该项目的其他项目将不会得到此依赖的传递。

 

依赖排除

       当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖,比如上例中的项目,我们不想引入传递性依赖commons-logging,我们可以使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusions的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。 如下是一个排除依赖的例子:

<dependency>

     <groupId>org.springframework</groupId>

     <artifactId>spring-core</artifactId>

     <version>2.5.6</version>

     <exclusions>

           <exclusion>

                <groupId>commons-logging</groupId>  

                <artifactId>commons-logging</artifactId>

           </exclusion>

     </exclusions>

 </dependency>

分享到:
评论

相关推荐

    Maven实战——入门篇

    ### Maven实战——入门篇 #### Maven简介与概念 Maven是一种强大的、跨平台的项目管理工具,主要用于基于Java平台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目还是大型的企业级应用,Maven都能...

    maven 实战 in action 中文版 3.3

    - **Maven实战——入门篇**:这本书的入门部分,引导读者快速上手Maven,理解基本概念和操作。 - **MAVEN使用最佳实践.doc**:可能包含更具体的项目构建、部署和团队协作的最佳实践指导。 以上只是对Maven基础...

    《Maven 实战》.zip

    Maven——这一Java社区事实标准的项目管理工具,能帮你从琐碎的手工劳动中解脱出来,帮你规范整个组织的构建系统。不仅如此,它还有依赖管理、自动生成项目站点等超酷的特性,已经有无数的开源项目使用它来构建项目...

    maven 实战(还没有看)

    **Maven实战——深入理解与应用** Maven是一款强大的Java项目管理工具,它通过XML格式的配置文件,统一管理项目的构建、报告以及依赖关系。在本文中,我们将深入探讨Maven实战中的关键概念,包括安装配置、项目构建...

    Maven《实战》许晓斌完整版包含源码

    **Maven实战——许晓斌完整版** Maven是一个强大的项目管理和构建工具,广泛应用于Java开发领域。由Apache Software Foundation维护,它简化了构建过程,通过一个统一的配置方式管理项目的构建、报告和依赖关系。...

    Maven实战.pdf

    《Maven实战》一书是针对Java开发人员深入学习和应用Maven构建工具的重要参考资料。Maven是一个项目管理和综合工具,它简化了构建、管理和部署Java项目的过程,通过标准化项目结构和自动化构建生命周期来实现这一...

    疯狂JAVA实战演义——源码

    《疯狂JAVA实战演义——源码》是一本深入解析JAVA编程实践的书籍,作者通过精心设计的15个实际应用开发案例,旨在帮助读者逐步掌握JAVA编程的核心技能,并提升其在实际开发中的应用能力。书中的每个实例都包含了完整...

    Maven实战 (Maven In Action)

    ### Maven实战 (Maven In Action) —— 关键知识点概览 #### 1. Maven简介与背景 **Maven** 是一款广泛应用于Java项目中的自动化构建工具,它以一种项目对象模型(POM)来管理项目的构建、报告和文档。通过简化项目...

    Maven实战 高清版

    《Maven实战》是国内第一本公开出版的Maven专著。它内容新颖,基于最新发布的Maven 3.0,不仅详尽讲解了Maven 3.0的所有新功能和新特性,而且还将这些新功能和新特性与Maven 2.x版本进行了对比,以便于正在使用...

    Maven3实战笔记08Maven反应堆

    ### Maven3实战笔记08——Maven反应堆:深度解析与实战应用 #### Maven反应堆的概念与作用 在深入探讨Maven反应堆之前,我们首先需要理解Maven项目是如何组织和构建的。Maven是一种自动化构建工具,它通过定义项目...

    Maven实战(入门篇)

    ### Maven实战(入门篇):理解Maven在项目构建中的角色与优势 #### Maven:知识的积累与专家级工具 Maven,源自于希伯来语的“Binyamin”,意指“理解的人”或“知识的积累者”。在软件开发领域,Maven扮演着项目...

    Maven实战.docx

    ### Maven实战知识点详解 #### 一、Maven简介与历史背景 Maven 是一个项目管理和理解工具,最初由 Sonatype 开发,后被 Apache 软件基金会接收并成为其顶级项目之一。它通过一系列标准的过程来管理项目的构建、报告...

    Maven实战(中文版)

    ### Maven实战(中文版)——关键知识点解析 #### 一、Maven简介 Maven是一款由Apache软件基金会提供的项目管理和构建工具,它基于项目对象模型(Project Object Model, POM),通过一小段描述信息来管理项目的构建...

    《Maven实战》

    Maven——这一Java社区事实标准的项目管理工具,能帮你从琐碎的手工劳动中解脱出来,帮你规范整个组织的构建系统。不仅如此,它还有依赖管理、自动生成项目站点等超酷的特性,已经有无数的开源项目使用它来构建项目...

    SSM实战项目——Java高并发秒杀API源码

    SSM实战项目是Java开发中的一个经典组合,它由Spring、SpringMVC和MyBatis三个框架构成。这个项目专注于高并发场景下的秒杀API实现,涵盖了如何在大量用户同时请求时保持系统的稳定性和高效性。以下是这个项目中涉及...

    javaweb课程设计:基于SSM的实战项目——图书管理系统.zip

    《基于SSM的实战项目——图书管理系统》是一个典型的JavaWeb应用程序,主要采用了Spring、SpringMVC和MyBatis三大框架,旨在提供一个完整的图书管理解决方案。这个项目源码适合用作学习材料,无论是毕业设计还是课程...

    Maven实战

    Maven——这一Java社区事实标准的项目管理工具,能帮你从琐碎的手工劳动中解脱出来,帮你规范整个组织的构建系统。不仅如此,它还有依赖管理、自动生成项目站点等超酷的特性,已经有无数的开源项目使用它来构建项目...

    eclipse使用maven整理文档.rar_captured7ne_eclipse mavenhelper_maven

    【标签】"captured7ne eclipse_mavenhelper maven"暗示了这个压缩包可能包含了Eclipse的一个插件——Maven Helper,这是一个Eclipse IDE的辅助工具,它可以帮助用户更好地理解和管理Maven项目中的依赖关系,例如显示...

Global site tag (gtag.js) - Google Analytics