maven 公共模块依赖_「spring-boot 源码解析」spring-boot 依赖管理

问题

maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包、三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整。

微信公众号:逸飞兮(专注于java知识领域的源码分析,从源码中理解框架/工具原理、验证CS专业知识)

解决方案

使用统一的依赖管理模块来管理工程中的 所有 依赖。

spring-boot 工程常使用 spring-boot-dependencies、spring-boot-starter-parent 管理工程依赖。

spring-boot 的最上级工程是 spring-boot-build,以下开始一步一步深入了解 spring-boot 依赖解决方案。

spring-boot 中的方案

spring-boot-build

spring-boot 的最上层工程,指定了 maven profiles、maven repositories、maven pluginRepositories、maven build pluginManagement。

  • profiles:中包含代码风格检查、代码风格 format;更方便导入 eclipse;maven 仓库
  • repositories:允许在开发过程中导入快照和里程碑 BOM。这个部分在 install/deploy 期间被 flatten 插件删除。包含 maven 中央仓库、spring 快照仓库、spring 里程碑仓库
  • pluginRepositories:插件仓库,包含 maven 中央仓库、spring 快照仓库、spring 里程碑仓库
  • pluginManagement:构建插件管理,这个插件的配置只用于存储 Eclipse m2e 设置,它对 Maven 构建本身没有影响。

spring-boot-dependencies

dependencies 的父工程是 spring-boot-build ,不包含代码,只用 pom 来管理依赖,pom.xml 如下:

org.springframework.boot spring-boot-build ${revision}../..spring-boot-dependenciespom

从 pom 中可以看出,spring-boot-dependencies 中除了引入了(3 个)插件,更多的是做版本的管理。

其中,引入的插件是:

  • flatten-maven-plugin:对 pom 精简插件
  • xml-maven-plugin:1. 根据 schema 验证 XML 文件;2. 使用 XSLT 样式转换 XML 文件
  • build-helper-maven-plugin:指定多个源码目录

dependencyManagement 中差不多管理了 spring-boot 工程中所有的依赖。

pluginManagement 中管理了常用的各种 maven 插件,这里就不详述了。

其中包含了 maven-clean-plugin、maven-compiler-plugin、maven-assembly-plugin、maven-war-plugin、maven-jar-plugin、 spring-boot-maven-plugin ,其中 spring-boot-maven-plugin 插件对于 spring-boot 工程非常重要,会把 maven 打包成的 jar 重新打包成可执行 jar。

spring-boot-starter-parent(重要)

既然有了 spring-boot-dependencies 这么丰富的依赖、插件版本管理,那么还搞一个 spring-boot-starter-parent 呢?

spring-boot-starter-parent 的父工程是 spring-boot-dependencies ,不包含代码,只用 pom 来管理依赖,pom.xml 如下:

org.springframework.boot spring-boot-dependencies ${revision}../../spring-boot-dependenciesspring-boot-starter-parentpomSpring Boot Starter ParentParent pom providing dependency and plugin management for applications built with Maven${basedir}/../../..1.8@UTF-8UTF-8${java.version}${java.version}${basedir}/src/main/resourcestrue**/application*.yml**/application*.yaml**/application*.properties${basedir}/src/main/resources**/application*.yml**/application*.yaml**/application*.propertiesorg.springframework.boot spring-boot-maven-plugin repackagerepackage${start-class}

特性

  • 默认编译版本:Java 1.8
  • 源码编码:UTF-8
  • 继承自 spring-boot-dependencies 的 dependencyManagement
  • spring-boot-maven-plugin 的 goal 设置为 repackage
  • maven 资源过滤(application*.yml、application*.yaml、application*.properties 等)、插件配置
  • 资源分隔符:“@”,在 application*.yml 中使用@来引用 maven 属性,常见用法如下:spring.application.name=@artifactId@

Note that, since the application.properties and application.yml files accept Spring style placeholders ( ${…} ), the Maven filtering is changed to use @..@ placeholders. (You can override that by setting a Maven property called resource.delimiter .)

译:

注意,由于 application.properties 和 application.yml 文件接受 spring 样式的占位符($…),所以 maven filter 将更改为使用@…@占位符。(可以通过设置名为 resource.delimiter 的 maven 属性来覆盖该属性。)

spring-boot-parent

org.springframework.boot spring-boot-dependencies ${revision}../spring-boot-dependenciesspring-boot-parentpom

dependencyManagement

包含两个部分:

  • 内部未发布的 spring-boot 依赖
  • 附加的 Spring 引导依赖项 (对用户无效)

因此,这里所加入的依赖管理,用户不需要关心,很好,省心。

dependencies

公共的依赖,主要是一些 测试 依赖,如:junit、hamcrest、mockito、spring-test,还有断言依赖:assertj。

plugins

添加了 spring-boot 公用的一些插件,如:maven-compiler-plugin、maven-jar-plugin、maven-war-plugin、maven-source-plugin 等

profiles

用户基本不用关心。省略

选择

spring-boot-dependencies 和 spring-boot-starter-parent、 spring-boot-parent 都提供了依赖管理的功能,那我们在开发的过程中,到底使用哪个呢?

  • spring-boot-parent :目的不是提供给用户使用的,使用 spring-boot 开源项目用于管理 spring-boot-project 整个大工程中的除了 spring-boot-starters (提供给我们使用的各个开箱即用的三方包) 的其他模块的。
  • spring-boot-starter-parent:我们通过 Spring Initializr 构建一个 spring-boot 项目的时候,官方默认是让我们使用的 spring-boot-starter-parent ,大致可以认为官方建议使用此方式管理依赖,毕竟此方式提供的依赖、插件管理更多,更适合使用。
  • spring-boot-dependencies:若在使用的时候,工程不想指定父工程,或者必须使用公司的父工程,可以通过 dependencyManagement 引入此依赖管理。

使用 spring-boot-dependencies,相比较 spring-boot-starter-parent 的时候特别注意要加上 spring-boot-maven-plugin ,如下:

org.springframework.boot spring-boot-maven-plugin org.springframework.boot spring-boot-maven-plugin ${springboot.version}

至于 spring-boot-starter-parent 的其他额外指定的 jar,按需添加。

实际使用

在工程中使用的时候,所有的二方、三方 jar 都应该统一管理,除了 spring-boot 提供的依赖,我们还有很多 jar 需要管理,如:mysql 驱动包、mybatis 包、各种工具包或者公司内的二方包等。因此,最好使用一个单独的模块来构建自己的 dependencies 或 parent。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】ABP源码分析三十五:ABP中动态WebAPI原理解析

动态WebAPI应该算是ABP中最Magic的功能之一了吧。开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能,这应该算是对DRY的最佳诠释了. 如下图所示,一行代码就为所有实现了IApplicationSer…

计算机科学与探索 影响因子,《计算机科学与探索》国家级计算机期刊投稿论文发表...

《计算机科学与探索》国家级计算机期刊投稿论文发表《计算机科学与探索》杂志简介-是不是正规期刊:《计算机科学与探索》是由中华人民共和国工业和信息化部主管、华北计算技术研究所361期刊网主办的国内外公开发行的计算机学报级高级学术期刊,中国计算机…

如何将SAP数据传输到其他系统(Transferring Data from SAP to Other Systems)

在sap里有GUI_DOWNLOAD 函数将sap的数据下载到客户端机器(presentation server),而Dataset则是将数据传输到应用服务器(Application server)。然而在有些时候需要将数据传输到第三方其他系统(3rd Party System)&#x…

jstl处理栏目与子栏目_Detelogy智能前处理设备微展厅P2:再添新品

时隔小半年,新一轮Detelogy产品总览展示栏目再与大家见面。事不宜迟,点击视频即刻进入我们的智能前处理设备微展厅。 知乎视频​www.zhihu.com01 高效多样品前处理系统02 智能浓缩设备全系列03 智能湿法消解设备应用领域农残、兽残检测有机磷类、有机氯类…

【转】ABP源码分析三十六:ABP.Web.Api

这里的内容和ABP 动态webapi没有关系。除了动态webapi,ABP必然是支持使用传统的webApi。ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net webApi。 AbpApiController:这是一个抽象基类,继承自ApiControl…

408最后计算机网络题库,2021考研计算机统考408专业基础综合题库

**部分为历年考研真题。提供2009~2018年考研真题及参考答案,其中2009~2015年每道真题均提供详细答案解析,通过对真题的演练和分析,可以帮助学员牢牢抓住计算机学科专业基础综合考试的命题特点,提高复习效率…

Unity-Shader-渲染队列,ZTest,ZWrite

Unity-Shader-渲染队列,ZTest,ZWrite ZTest(深度测试)和ZWrite(深度写入)ZTest Less(深度小于当前缓存则通过)ZTest Greater(深度大于当前缓存则通过)ZTest L…

如何做好职业规划(乾卦)

职业一般来说会占用我们每个人生命中的大部分时间,而职业发展中变化莫测的因数常常令我们束手无策、捉襟见肘。在面对变化多端的情况时,中国人的传统智慧就发挥出最大的优势了。如何将快速变化 、不好掌控的事情处理得井井有条,这需要我们懂得…

850是什么意思_沃尔沃为什么不是一线豪华品牌?

1927年诞生的沃尔沃,它造车的历史比宝马还要略早几年。但经过近百年的发展,宝马品牌无论在国际上还是我们国内,以销量还是品牌含金量来看,都是众所公认的豪华品牌第一阵营成员(奔驰、宝马,奥迪)…

【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API

ABP提供Script Proxy WebApi为所有的Dynamic WebApi生成访问这些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。这些个代理就是javascript脚本,通过这些代理可以简单的访问Dynamic webApi。 如下实例演示一个最基本的应用场景。首先通过Script Proxy Web…

repeater导出excel html,Repeater显示数据,并且导出到excel

我的数据是自己手工生产,然后repeater绑定,最后导出excel,但出现问题,谁可以给个例子什么的没有。关键代码如下:protected void LinkButton1_Click(object sender, EventArgs e){string time DateTime.Now.ToString(&…

重新学.Net[一]——.Net的组成

.Net是一个广义的名词。它是一个平台或说是战略。在.Net诞生之初,微软在其一系列产品中都冠以.Net的标签。这也给很多人带来疑惑和不解,到底.Net中具体包含什么?这个问题不仅是我有,我想,甚至微软本身以及一些专家也会…

word2003如何设置护眼模式_手机屏幕的护眼模式是如何保护你的眼睛?

公司业务包括:二手机回收,二手机销售,配件批发,以及手机维修等业务,目前公司业务覆盖山西全境以及周边省市,在同行业有较高知名度。 随着智能手机的普及,大多数人也逐渐开始沉迷于每天的刷手…

WinCE系统的编译过程

作者:ARM-WinCE 在WinCE系统中,当我们完成了相关的开发和系统定制工作以后,会编译WinCE系统,最后生成NK.bin和NK.nb0。我现在用WinCE6.0在自己的PC上面编译一次用时19分16秒(有一天无聊,就测了一下)。下面介绍一下WinC…

【转】ABP源码分析三十八: ABP.Web.Api.OData

如果对OData不熟悉的话可参考OData的初步认识一文以获取OData的一些初步知识。 API.Odata 模块唯一用处就是提供了一个泛型版本的ODataController&#xff0c;实现了Controller代码的常用。 AbpODataEntityController<TEntity, TPrimaryKey>&#xff1a;使用ABP的repos…

由表单中onsubmit=return false;想到的

众所周知&#xff0c;在表单中加上οnsubmit"return false;"可以阻止表单提交。 下面是简单的一小段代码&#xff1a; 代码<form action"index.jsp" method"post" onsubmit"submitTest();"> <INPUT value"www">…

计算机知识竞赛主持人开场词,护理竞赛主持人台词:主持人开场白台词

专科护理在世界范围内蓬勃发展&#xff0c;高质量的专科护理人才是推动护理事业发展的原动力。下面是小编给大家整理的护理竞赛主持人台词&#xff0c;仅供参考。护理竞赛主持人台词【篇一】在这充满火热激情的季节&#xff0c;我们又迎来了“5.12国际护士节”。让我们首先向辛…

饭卡可以用水冲洗吗_薄壁不锈钢水管真的可以满足大众用水健康管道的要求吗?...

我们都认识现如今的自来水的出厂干净程度达到安全、卫生&#xff0c;干净标准。但是&#xff0c;很是收到不少市民的投诉&#xff0c;说日常饮用的自来水有异味、浑浊、杂质&#xff0c;为何会出现这番现象呢&#xff0c;为此&#xff0c;我国也针对此研究调查&#xff0c;最后…

WinCE的快速启动

PXA270上的双启动功能已经实现了&#xff0c;但又引入了一个新问题&#xff0c;WinCE的启动太慢&#xff0c;大概需要2分钟&#xff01;这显然是不能忍受的。通过两天的努力&#xff0c;现在已经缩短到20秒&#xff0c;虽然还是有点长&#xff0c;但已改善不少了。先整理一下&a…

【转】ABP源码分析三十九:ABP.Hangfire

ABP对HangFire的集成主要是通过实现IBackgroundJobManager接口的HangfireBackgroundJobManager类完成的。 HangfireBackgroundJobManager:实现了接口IBackgroundJobManager中的方法EnqueueAsync&#xff0c;通过HangfireBackgroundJob完成Enqueue。重写了BackgroundWorkerBase…