Maven核心概念之依赖,聚合与继承
一、依赖
我们项目中依赖的jar包可以通过依赖的方式(dependencies元素下添加dependency子元素)引入。
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- </dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
1.依赖范围
通过控制依赖的范围,可以指定该依赖在什么阶段有效。
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- <scope>test</scope>
- </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了。
- <!-- 排除依赖 -->
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- <optional>true<optional>
- </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>元素排除即可,这种用法可以刻解决包版本冲突的问题。
- <!-- 排除依赖 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- </exclusions>
- </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中。
- <!-- 把这三个模块聚合在一起, <module></module> 中间的内容为子模块工程名的相对路径 -->
- <modules>
- <module>../user-core</module>
- <module>../user-log</module>
- <module>../user-service</module>
- </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文件声明与平常一样,提取公共地方,子模块需要继承父模块。
- <!--继承user-parent的父模块-->
- lt;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>

<!--继承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核心概念之依赖,聚合与继承的更多相关文章
- Maven(三)理解Maven核心概念
转载自: http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 本文以类图的方式,介绍maven核心的12个概念以及相互之间的 ...
- (转)Maven学习总结(四)——Maven核心概念
孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...
- Maven学习总结(4)——Maven核心概念
Maven学习总结(四)--Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识 ...
- maven 核心概念
1). 项目构建过程中的各个环节 . 清理 . 编译 . 测试 . 报告 . 打包 . 安装 . 部署 2). 配置环境变量 . 配置 JDK 配置 JAVA_HOME + PATH maven 需要 ...
- Maven学习(五)-- 聚合与继承
标签(空格分隔): 学习笔记 Maven的聚合特性能够把项目的各个模块聚合在一起构建: Maven的继承特性能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能够促进各个模块配置的一致性 ...
- 《Maven实战》笔记-5-pom聚合和继承
一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过acc ...
- maven核心概念--插件和目标
maven的核心概念有很多,我们这里先来看Plugins和Goals. 在上一篇博客中,我们用两种类型的命令行参数运行了Maven. 第一条命令,create.这是一条单个的插件目标,Archetyp ...
- maven 学习笔记--仓库,聚合和继承,私服搭建
仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...
- Maven核心概念之仓库,生命周期与插件
宏观图 一.仓库 统一存储全部Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(还有一种特殊的远程仓库,为节 ...
随机推荐
- [已解决] java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.com.yourproject.test_jsp
同事遇到了一个问题,开始项目运行的好好的,过了一段时间再访问页面会报出如下错误信息(只贴了部分), 这是为啥呢,可能是由于servlet-api版本jar包重复导致的,他项目本身使用了servlet- ...
- 杭电1013-Digitai Root(这是一道考研编程题-天大2015)
Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- POJ 2406:Power Strings
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 41252 Accepted: 17152 D ...
- JVM的classloader(转)
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存. 这四个类加载器分别为:Bootstrap ClassLoader.Extension Class ...
- javascript中set与get方法详解
其中get与set的使用方法: 1.get与set是方法,因为是方法,所以可以进行判断. 2.get是得到 一般是要返回的 set 是设置 不用返回 3.如果调用对象内部的属性约定的命名方式是_a ...
- [美]莫提默 J. 艾德勒《如何阅读一本书》
我最近在阅读一本书,这本书的书名叫<如何阅读一本书>(商务出版社,2015),顾名思义. 作者认为,阅读是一件跟写书一样复杂的活动,而许多人并不会阅读. 看过后,你可能会有“我真没 ...
- spark记录
Filtering multiple values in multiple columns: In the case where you're pulling data from a database ...
- C++实现的屏幕截图软件 v1.0
之前用win32做的屏幕截图软件,使用了好久,非常好用. 在2.0版本中增加了屏幕尺和颜色拾取功能,并且改用屏幕和内存DC双缓冲,彻底消灭了闪屏,可惜代码丢失了 好不容易找到1.0版本的代码,以后再重 ...
- 我的android学习经历30
数据存储的持久化技术 数据存储主要有五种方式: (1)文件存储或者SD卡 (2)SharedPreferences (3)SQLite (4)ContentProvider (5)网络存储 下面简单介 ...
- uTenux——软件底层驱动组织结构介绍
经过第一节对uTenux初步认识和第二节对uTenux\AT91SAM3S4C开发板的硬件结构的介绍,这一节我们将要学习的是uTenux\AT91SAM3S4C的软件底层驱动. 在悠龙公司的官网或者u ...