一、依赖

我们项目中依赖的jar包可以通过依赖的方式(dependencies元素下添加dependency子元素)引入。

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.10</version>
  5. </dependency>
   <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.10</version>

    </dependency>

1.依赖范围

通过控制依赖的范围,可以指定该依赖在什么阶段有效。

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.10</version>
  5. <scope>test</scope>
  6. </dependency>
 <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.10</version>

      <scope>test</scope>

    </dependency>

maven的几种依赖范围(<scope></scope>)

名称

有效范围

Compile

编译,测试,运行。默认的依赖范围

Test

测试,如Junit

Runtime

运行,如JDBC

Provided

编译,测试,如ServletAPI

System

编译,侧四,依赖于系统变量

2.依赖具有传递性

2.1依赖传递的规则

规则-级别一样,就先用第一个,级别不一样,就用级别最少的

解释:级别(依赖的层次)一样的,就按照顺序,依赖第一个(层次为0);如果出现层次(层次>0),就先依赖层次最少的;

2.2去除依赖的两种方式

选择性依赖

在依赖中用<optional>直接去除这种依赖传递的特性,也就是说,如果别的项目引用设置了此依赖的项目,这个commons-longging不会被依赖到。例如在项目A中配置commons-logging的依赖,如果项目B依赖项目A,那么,此时项目B中不会依赖commons-logging了。

  1. <!-- 排除依赖 -->
  2. <dependency>
  3. <groupId>commons-logging</groupId>
  4. <artifactId>commons-logging</artifactId>
  5. <version>1.1.1</version>
  6. <optional>true<optional>
  7. </dependency>
<!-- 排除依赖 --> 

 <dependency>

 <groupId>commons-logging</groupId>

 <artifactId>commons-logging</artifactId>

 <version>1.1.1</version>

 <optional>true<optional>

 </dependency>

排除依赖

如果第三方的jar包没有用<optional>去除依赖的传递性,那么我们可以在当前的项目中使用<exclusion>元素声明排除依赖。例如,项目A中配置了spring-core的依赖,如果项目B需要引用项目A,但是同时又不需要commons-logging的包,这个时候使用<exclusion>元素排除即可,这种用法可以刻解决包版本冲突的问题。

  1. <!-- 排除依赖 -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-core</artifactId>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>commons-logging</groupId>
  8. <artifactId>commons-logging</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
<!-- 排除依赖 -->

 <dependency>   

         <groupId>org.springframework</groupId> 

         <artifactId>spring-core</artifactId> 

            <exclusions>

                    <exclusion>

                            <groupId>commons-logging</groupId>

                            <artifactId>commons-logging</artifactId>

                    </exclusion>

            </exclusions>

</dependency>

二、聚合

一个项目往往由多个模块构成的,在进行构建时,针对每个模块都进行构建命令是一件非常繁琐又容易出错的事情,所以Maven的聚合功能能够替我们完成进行一次构建命令完成全部模块的构建。

Maven的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为POM,通过<modules>将各模块集中到父POM中。

  1. <!-- 把这三个模块聚合在一起, <module></module> 中间的内容为子模块工程名的相对路径 -->
  2. <modules>
  3. <module>../user-core</module>
  4. <module>../user-log</module>
  5. <module>../user-service</module>
  6. </modules>
  <!-- 把这三个模块聚合在一起, <module></module> 中间的内容为子模块工程名的相对路径 -->

  <modules>

          <module>../user-core</module>

          <module>../user-log</module>

          <module>../user-service</module>

  </modules>

原理:父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/Java 和 src/test/java 目录。Maven会首先解析聚合模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。

三、继承

Maven中继承的概念与面向对象的继承概念是一致的,通过继承消除重复编码的行为。在这里,我们也可以用一个父模块来完成父模块与子模块共用依赖的继承关系。父模块

父模块的POM文件声明与平常一样,提取公共地方,子模块需要继承父模块。

  1. <!--继承user-parent的父模块-->
  2. lt;parent>
  3. <groupId>com.tgb.bobo</groupId>
  4. <artifactId>user-parent</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <!-- 继承的绝对路径是pom文件 -->
  7. <relativePath>../user-parent/pom.xml</relativePath>
  8. </parent>
  9. <!--本模块的声明-->
  10. <artifactId>user-service</artifactId>
  11. <packaging>jar</packaging>
 <!--继承user-parent的父模块-->

<parent>

          <groupId>com.tgb.bobo</groupId>

          <artifactId>user-parent</artifactId>

          <version>0.0.1-SNAPSHOT</version>

          <!-- 继承的绝对路径是pom文件 -->

          <relativePath>../user-parent/pom.xml</relativePath>

  </parent>

 <!--本模块的声明-->

  <artifactId>user-service</artifactId> 

  <packaging>jar</packaging>

并不是所有的POM元素都可以被继承,如图表3是一个可继承的元素列表:

聚合和继承存在一些共性和潜在的联系,在实际应用中,经常将聚合模块的父模块和继承的父模块定义为同一个。

Maven核心概念之依赖,聚合与继承的更多相关文章

  1. Maven(三)理解Maven核心概念

    转载自: http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 本文以类图的方式,介绍maven核心的12个概念以及相互之间的 ...

  2. (转)Maven学习总结(四)——Maven核心概念

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...

  3. Maven学习总结(4)——Maven核心概念

    Maven学习总结(四)--Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识 ...

  4. maven 核心概念

    1). 项目构建过程中的各个环节 . 清理 . 编译 . 测试 . 报告 . 打包 . 安装 . 部署 2). 配置环境变量 . 配置 JDK 配置 JAVA_HOME + PATH maven 需要 ...

  5. Maven学习(五)-- 聚合与继承

    标签(空格分隔): 学习笔记 Maven的聚合特性能够把项目的各个模块聚合在一起构建: Maven的继承特性能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能够促进各个模块配置的一致性 ...

  6. 《Maven实战》笔记-5-pom聚合和继承

    一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过acc ...

  7. maven核心概念--插件和目标

    maven的核心概念有很多,我们这里先来看Plugins和Goals. 在上一篇博客中,我们用两种类型的命令行参数运行了Maven. 第一条命令,create.这是一条单个的插件目标,Archetyp ...

  8. maven 学习笔记--仓库,聚合和继承,私服搭建

    仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...

  9. Maven核心概念之仓库,生命周期与插件

    宏观图 一.仓库 统一存储全部Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(还有一种特殊的远程仓库,为节 ...

随机推荐

  1. 怎样新建Oracle数据库

    新建Oracle数据库三种方法:1.通过运行Oracle Database Configuration Assistant 创建配置或删除数据库(也可在命令行下输入dbca):2.用命令行的方式建立数 ...

  2. jquery函数和javascript函数的区别

    一.窗口加载:http://www.w3school.com.cn/js/js_library_jquery.asp 在 JavaScript 中,您可以分配一个函数以处理窗口加载事件: JavaSc ...

  3. 基于SURF特征的图像与视频拼接技术的研究和实现(一)

    基于SURF特征的图像与视频拼接技术的研究和实现(一)      一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...

  4. java5、java6、java7、java8的新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

  5. 【Toolkit】关闭Closeable的简单工具类

    Java中有很多连接类的类实现java.io.Closeable,而关闭资源是一项重复的劳动,写一个简单的工具类避免重复劳动. > JDK7.0中,哪些类实现java.io.Closeable?

  6. C语言中的++和--

    这个问题是老生常谈的问题了,虽然诸多大牛都深恶痛绝的告诉所有人不要那样写,但这永远挡不住学校的老师和考试. 今天我们来辨析一下这个东西. 首先我们来名词辨析一下吧: ++i 这个叫   前自增 i++ ...

  7. 关于Android6.0之后的权限问题

    https://github.com/mylhyl/AndroidAcp AndroidAcp 使用: 加入 compile 'com.mylhyl:acp:1.1.7' PermisionUtils ...

  8. C#其他

    1.switch - if ...else if...switch(表达式) { case 值: ..... break; case 值: ..... break; default: ..... br ...

  9. BZOJ 3202 项链

    题目连接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3202 题意:一个项链由n个珠子组成.每个珠子有三个面,每个面上有一个数字,要求每个 ...

  10. CSS3教程链接

    下面列出本站关于CSS3的相关链接,以方便大家阅读: 第一节:<CSS3 Gradient> 第二节:<CSS3 RGBA> 第三节:<CSS3 Border-radiu ...