- 浏览: 796633 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (651)
- Java (39)
- Java 初学者小问题 (66)
- 设计模式 (7)
- 项目管理 (3)
- 数据库 (1)
- 算法 (2)
- Java practices (6)
- Effective Java2读书笔记 (78)
- Linux (2)
- programming ruby 读书笔记 (5)
- Core Java Ninth Edition Volume I 读书笔记 (15)
- Pro Git 读书笔记 (12)
- Git (3)
- Maven in Action 读书笔记 (20)
- Web (12)
- 非技术类书籍 (11)
- 电影 (40)
- Web Cache (1)
- jquery (0)
- 历史 (4)
- Dive Into HTML5 读书笔记 (13)
- 三国演义小学毕业考 (79)
- 高效能人士的7个习惯 读书笔记 (12)
- Java Performance 读书笔记 (3)
- Protocol Buffer 学习笔记 (6)
- Mongo DB 学习笔记 (7)
- Morphia 学习笔记 (7)
- Algorithms -- Princeton 学习笔记 (13)
- String研究 (10)
- Hadoop: The Definitive Guide 读书笔记 (3)
- Java与模式读书笔记 (5)
- Date研究 (3)
- The Roman Empire 听课笔记 (4)
- Algorithms -- Standford 学习笔记 (16)
- Core Java Ninth Edition Volume II 读书笔记 (9)
- Thinking in Java 4th Edition 读书笔记 (21)
- Node : Up and Running 学习笔记 (5)
- Eloquent Javascript (8)
- Smashing Node.js 读书笔记 (1)
- Algorithms II -- Standford 学习笔记 (19)
- Algorithm II -- Princeton 学习笔记 (14)
- 网络安全 (2)
- Javascript (4)
- 正则表达式 (1)
- JAVA 7/8 (15)
- JVM (10)
- NodeJS (1)
- 鸟哥的linux私房菜读书笔记 (14)
- Web Service (1)
- The art of programming (9)
- Introduction to Algorithm 读书笔记 (4)
- Java 源码阅读 (0)
- Spring in Action 读书笔记 (2)
- Java Network Programming 读书笔记 (2)
最新评论
-
心存高远:
谢谢作者分享,刚好看到这里不太明白,现在茅塞顿开。不过runt ...
关于 Maven的传递依赖的理解 -
sxlkk:
851228082 写道甚至在某次技术会议现场遇到《Maven ...
关于 Maven的传递依赖的理解 -
851228082:
851228082 写道a----compile----b-- ...
第五章 坐标和依赖 -
851228082:
a----compile----b-----provided- ...
第五章 坐标和依赖 -
851228082:
甚至在某次技术会议现场遇到《Maven in action》的 ...
关于 Maven的传递依赖的理解
1. 为了能用一条命令来构建一个实际项目下的多个模块,而不是到两个模块目录下分别执行 mvn 命令, Maven 提供了聚合(或者称为多模块)的特性。我们可以额外建一个聚合用的模块,它仅有一个 pom.xml 文件,没有别的目录和文件。在它的 pom.xml 中 packaging 必须为 POM ,并且多了一个 <modules> 元素。在 <modules> 中每一个 <module> 声明一个实际项目中的一个模块。这里的值不是模块的 artifactId ,而是模块目录相对于当前 POM 所在目录的相对路径。一般会将聚合模块放在项目目录的最顶层,其他功能模块作为聚合模块的子目录存在,子目录取名与功能模块的 artifactId 一致。比如:
<groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Aggregator</name> <modules> <module>account-email</module> <module>account-persist</module> </modules>
对应的目录结构为
2. 我们可以为项目的所有功能模块创建一个父模块,然后在父 POM 中声明一些配置供子 POM 继承,以实现“一处声明,多处使用的目的”。父模块只有一个 pom.xml 文件,没有别的目录和文件。 pom.xml 中的 packaging 值必须为 POM 。在子 POM 中需要声明父模块:
<parent> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../account-parent/pom.xml</relativePath> </parent>
元素 relativePath 声明了父 POM 的相对路径,默认值是 ../pom.xml 。同样还需要把父模块也加入到聚合模块中。
3. 可继承的 POM 元素有:
1) groupId
2) version
3) description ( 没有 artifactId 和 name)
4) organization
5) inceptionYear ( 项目创始年份 )
6) url
7) developers
8) contributors
9) distributionManagement
10) issueManagement (项目的缺陷跟踪系统信息)
11) ciManagement (项目的持续集成系统信息)
12) scm (项目的版本控制系统的信息)
13) mailingLists
14) properties
15) dependencies
16) dependencyManagment
17) repositories
18) build (包括项目的源码目录、输出目录、插件配置、插件管理配置等)
19) reporting (包括项目的报告输出目录配置、报告插件配置等)
4. 虽然 depedencies 是可以被继承的,但如果所有的子模块都必须继承父模块的所有 dependencies 显然是不合理的, Maven 在父 POM 中提供了 dependencyManagement 元素,能让子 POM 有选择地继承依赖。父模块的 dependencyManagement 元素中用 dependencies 元素声明的依赖,可以被子 POM 有选择地继承,方法是在子 POM 的 dependencies 元素中也声明该依赖,并且只需要声明 goupId 和 artifactId 即可,当然也可以声明别的属性来覆盖父 POM 中的声明。如果子模块不声明依赖的使用,那在 POM 中 dependencyManagement 中声明的依赖不会产生任何效果。
5. import 范围的依赖只有在 dependencyManagement 中声明才有效果,使用该范围的依赖通常指向另一个 POM ,作用是将目标 POM 中的 dependencyManagement 配置导入并合并到当前 POM 的 dependencyManagement 配置中。如:
<dependencyManagement> <dependencies> <dependency> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-parent</artifactId> <version>1.0-SNAPSHOT</version <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyMangement>
注意,上述代码中 type 值必须为 pom 。如果有多个实际项目,它们使用的依赖版本都是一致的,则可以定义一个专门管理共用依赖的 POM ,然后在各个实际项目中导入这个 POM 的 dependencyManagment 。
6. Maven 也提供了 pluginManagement 元素帮助管理插件。在该元素中配置的依赖不会造成实际的插件调用行为,当 POM 中配置了真正的 plugin 元素,并且其 groupId 和 artifactId 与 pluginManagement 中配置的插件匹配时, pluginManagment 的配置才会影响实际的插件行为。
7. 当项目中的多个模块有同样的插件配置时,应当将配置移到父 POM 的 pluginManagement 元素中。即使各个模块对于同一插件的具体配置不尽相同,也应当使用父 POM 的 pluginManagement 元素统一声明插件的版本。这样可以统一项目使用的插件版本。
8. 一个 POM 可以既是聚合 POM ,又是父 POM 。我们一般为了方便可以这么做。(子 POM 中 relativePath 的默认值本就指向 ../pom.xml )
9. 在使用 Maven 的过程中我们应该注意:约定优于配置。任何一个 Maven 项目都隐式地继承自超级 POM ,对于 Maven 3 而言,超级 POM 在 lib/maven-model-builder-x.x.x.jar 中的 org/apache/maven/model/pom-4.0.0.xml 下,对于 Maven 2 而言,超级 POM 在 lib/maven-x.x.x-uber.jar 中的 org/apache/maven/project/pom-4.0.0.xml 下。这里 x.x.x 表示 Maven 的具体版本号。
10. 在一个多模块的 Maven 项目中, Reactor 是指所有模块组成的一个构建结构。对于单模块的项目, Reactor 就是该模块本身。而对多模块项目来说, Reactor 就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。
11. 实际的多模块构建顺序是这样形成的: Maven 按序读取 POM (聚合模块本身就是第一个 POM ),如果该 POM 没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖模块还依赖其他模块,则进一步构建依赖的依赖。
12. Maven 命令提供如下选项,实时裁剪 Reactor :
-am, --also-make 同时构建 -pl 参数中所列模块的依赖模块
-amd, --also-make-dependents 同时构建依赖于 -pl 参数中所列模块的模块
-pl, --projects <arg> 构建指定的模块,模块间用逗号分隔。
-rf, --resume-from <arg> 从 Reactor 中指定的模块开始构建,至 Reactor 结束。
发表评论
-
关于 Maven的传递依赖的理解
2012-09-30 09:50 13983今天又回顾了一下 《Maven in Action》的读书笔记 ... -
《Maven in Action》读后感
2012-02-23 23:48 2210今天终于读完了《Maven in Action》一书,真所谓书 ... -
第十八章 Archetype
2012-02-23 23:30 50821. Archetype 是 Maven ... -
第十七章 编写Maven插件
2012-02-23 19:42 44921. 编写 Maven 插件的主要步骤 ... -
第十六章 m2eclipse
2012-02-23 15:44 23771. m2eclipse ( http: ... -
第十五章 生成项目站点
2012-02-21 09:27 22881. Maven 社区提供了大量插件,能让用户 ... -
第十四章 灵活的构建
2012-02-20 16:21 18701. 通过 <propertie ... -
第十三章 版本管理
2012-02-20 15:57 21191. 版本管理( Version Manage ... -
第十二章 使用Maven构建Web应用
2012-02-15 18:38 60411. Web 项目的 POM ... -
第十一章 使用Hudson进行持续集成
2012-02-09 17:09 23171. 持续集成就是快速 且高频率 ... -
第十章 使用Maven进行测试
2012-02-05 22:17 214101. com.google.code. ... -
第九章 使用Nexus创建私服
2011-12-06 23:17 108051. Nexus 分为开源版和企业版,开源 ... -
第七章 生命周期和插件
2011-12-05 13:36 23081. Maven 的生命周期就是为了对所有的构 ... -
第六章 仓库
2011-12-03 18:44 24071. Maven 在一个工作站上的某个位置统一 ... -
第五章 坐标和依赖
2011-12-03 15:14 20851. Maven 定义了这样一组规则:世界上任 ... -
第四章 背景案例
2011-12-02 21:20 14231. 主要场景: 1) 用户访问注册页面 2) ... -
第三章 Maven 使用入门
2011-12-01 18:40 25501. 就像Make的Makefile, Ant的build. ... -
第二章 Maven的安装和配置
2011-12-01 10:01 62401. 设置JAVA_HOME, Path中加入%JAVA_H ... -
第一章 Maven 简介
2011-12-01 09:48 22891. Maven 是优秀的构建工 ...
相关推荐
背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...
在C++语言中,继承与多态是面向对象编程的两个核心特性,它们不仅提供了代码复用的机制,还极大地增强了程序设计的灵活性和可扩展性。理解这些概念对于掌握C++的精髓至关重要。 首先,让我们深入探讨继承。继承是...
LACP(链路聚合控制协议)是一种实现链路动态聚合与解聚合的协议。 端口聚合的基本概述: 端口聚合主要用于交换机之间的连接,将多个连续端口聚合在一起形成一个汇聚组,以实现负荷在各成员端口中的分担,提高网络...
第8章:聚合和继承/8.4 聚合与继承的关系 第8章:聚合和继承/8.5 约定优于配置 第8章:聚合和继承/8.6 反应堆/8.6.1 反应堆的构建顺序 第8章:聚合和继承/8.6 反应堆/8.6.2 剪切反应堆 第9章:使用Nexus创建私服/9.2...
OOAD第八章主要讨论了如何进行有效的对象设计,包括对象的发现、属性、行为以及关系。 首先,类图是展示系统结构的重要工具,它由类及其之间的关联构成。类是面向对象设计的基本构造块,代表现实世界中的实体或概念...
在本压缩包中,"第八章,com的聚合"可能是一个关于COM组件聚合的教程或者案例集,其中包含了多个文件,可能包括源代码、解释文档等,用于帮助学习者理解并掌握COM组件的聚合概念。 COM组件聚合是指一个COM对象可以...
在Unity3d游戏开发中,集成第三方广告平台如抓猫聚合SDK,可以帮助开发者实现游戏内的广告展示,从而获得收益或推广。以下将详细介绍如何在Unity3d中嵌入抓猫聚合平台广告的步骤: 1. **获取必要的资源**:首先,你...
1. has-a关系表示一个类包含或拥有另一个类的实例作为其成员,这种关系也被称为聚合。例如,一个汽车类可能has-a引擎类,意味着汽车包含一个引擎对象。 2. uses-a关系则表示一个类使用另一个类的服务或功能,但并不...
目录 ...第8章 设计系统体系结构 第9章 选择技术 第10章 设计子系统 第11章 可重用的设计模式 第12章 指定类的接口 第13章 不间断的测试 附录A Ripple小结 附录B iCoot案例分析 附录C UML表示法小结
8. **第八章:备份与恢复** - 备份策略和类型 - RMAN(Recovery Manager)工具的使用 - 数据库的完整备份和增量备份 - 灾难恢复和闪回技术 9. **第九章:性能优化** - SQL性能分析工具(如Explain Plan) - ...
第九章通常会涉及类、对象和继承等面向对象编程的关键概念。以下是对每个子文件的简要分析和知识点概述: 1. **9_26.cpp**:可能涉及到多态性与虚函数的使用,通过创建基类指针指向派生类对象,演示了动态绑定...
在软件工程领域,第七章通常会深入探讨统一建模语言(Unified Modeling Language,简称UML),这是一种标准化的图形表示法,用于系统、软件和业务过程的建模。UML是软件开发过程中的重要工具,它为设计者提供了一种...
**第8章:组件图与部署图** 在这一章,你将学习如何利用组件图描述软件系统的模块化结构,以及使用部署图来表示硬件和软件的物理部署。 **第9章:包图与依赖关系** 包图用于组织和管理模型元素,本章将教你如何使用...
《大数据技术原理与操作应用》第7章的习题涉及到Hive的基本概念、数据类型、操作以及数据仓库的相关知识。以下是这些知识点的详细解释: 1. Hive 的数据类型: - `decimal(x,y)` 与 `FLOAT` 和 `DOUBLE` 的区别...
在本资源中,我们聚焦于"C#"这门编程语言,并且重点探讨了其在实际应用中的各种编程实例,尤其体现在第二章的内容。"C#",全称C Sharp,是由微软公司开发的一种面向对象的编程语言,它在.NET框架下运行,广泛应用于...
面向对象程序设计是一种重要的编程范式,它基于“对象”的...以上是针对《面向对象程序设计》第12章在线测试中所涵盖的知识点的详细解释,这些知识点构成了面向对象编程的基础,对于理解和实践面向对象编程至关重要。
第8章 Web窗体的数据控件 8.1 数据源控件 8.1.1 SQL数据源控件(SqlDataSource) 8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) ...
第四章主要讲解的是C++中的核心概念——类与对象,这是面向对象编程的基础。面向对象编程(OOP)的核心特性之一就是封装(Encapsulation),它将数据和操作这些数据的函数封装在一起,形成一个整体,即类。在C++中,...
第八章 字符串 * 字符串的概念:字符串是一种特殊的数据类型,用于表示一串字符。 * 字符串的操作:包括字符串的连接、截取、查找和比较等。 第九章 数组 * 数组的概念:数组是一种数据结构,用于存储多个相同...