在 maven 多模块项目中,为了保持模块间依赖的统一,常规做法是在 parent model 中,使用 dependencyManagement 预定义所有模块需要用到的 dependency(依赖)
parent:复用父类元素
dependencyManagement:子模块中可以选择性继承父类的依赖,此标签中的依赖子pom不会自动继承,子pom需要额外声明。但是,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,确保版本一致。
Import:只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中。
properties属性:通过元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。
Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
依赖统一管理(parent 中定义,需要变动 dependency 版本,只要修改一处即可);
代码简洁(子 model 只需要指定 groupId、artifactId 即可)
dependencyManagement 只会影响现有依赖的配置,但不会引入依赖,即子 model 不会继承 parent 中 dependencyManagement 所有预定义的 depandency,只引入需要的依赖即可,简单说就是“按需引入依赖”或者“按需继承”;因此,在 parent 中严禁直接使用 depandencys 预定义依赖,坏处是子 model 会自动继承 depandencys 中所有预定义依赖;
但是,问题也出现了:
单继承:maven 的继承跟 java 一样,单继承,也就是说子 model 中只能出现一个 parent 标签;
parent 模块中,dependencyManagement 中预定义太多的依赖,造成 pom 文件过长,而且很乱;
如何让这些依赖可以分类并清晰的管理?
问题解决:import scope 依赖
如何使用:
maven2.9 以上版本
将 dependency 分类,每一类建立单独的 pom 文件
在需要使用到这些依赖的子 model 中,使用 dependencyManagement 管理依赖,并 import scope 依赖
注意:scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<!-- 重要:版本号要和父模块中预定义的spring boot版本号保持一致 -->
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
maven 编译后,下载了 pom 文件,在 maven 的本地仓库下查看 pom 文件如下:
好处分析:
单一职责原则,根据依赖的分类,细化每一个单一职责的 pom 文件
解决单继承问题,通过 import pom 文件达到依赖的目的(典型的非继承模式),从而不用从父类中引用依赖
父模块的 pom 就会非常干净,容易维护
参考文章:
Maven 实战(三)——多模块项目的 POM 重构
使用 import scope 解决 maven 继承(单)问题
Maven 中的 import scope
maven 之非继承引用 dependency
阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。
SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。
Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。
这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
皮肤开发指南
Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。
Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。
Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。
Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。
DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。
i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。
Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。
SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。
Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。