本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;
你好,这里是Java方向盘,我是方向盘(YourBatman),坐稳扶好,开始发车。
Title | Link |
---|---|
所属专栏 | 【方向盘】-IntelliJ IDEA |
源代码 | |
程序员专用网盘公益上线啦,注册送1G超小容量,帮你实践做减法 | |
Java开发软件包(Mac) | https://wangpan.yourbatman.cn/s/rEH0 提取码:javakit |
女娲工程 | http://152.136.106.14:8761 |
版本约定 | IntelliJ IDEA 2022.1.1 |
之前有追写过多篇IDEA新特性的文章,每篇都能被CSDN官方首页推荐/公众号转载: | |
每次IDEA发布新版本,我都是第一时间升级。现在为啥不追着写篇文章介绍了呢?主要有两个原因:
所以每次,自己默默升上去就好:
Tips:每次升级IDEA后都能看到全新的启动图,还蛮有新鲜感的。
本文并不是介绍IDEA 2022.1版本的新特性,而是只着眼于笔者对此次版本升级“最感兴趣”的部分:IDEA依赖分析器。顺道简单介绍下Maven,以及笔者卸载掉的Maven Helper插件。
Maven是Apache开源组织奉献的一个开源项目。Maven这个单词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。它是跨平台的,这意味着无论是在Windows上,还是在Linux或者Mac上,都可以使用同样的命令。
说了这么多,本文只着眼于Maven的一项功能:依赖管理。这是开发者和Maven打交道最多的功能,也是Maven的核心能力之一。
早期的Java开发者,依赖需要手动管理,是个大问题。你造的,这种事不仅费时费力,而且还容易出错。Ant缓解了这个问题,但还是直到Maven的出现,才真正彻底解决了依赖管理这个问题,让开发者可以全心投入到开发中去。
要理解好Maven的依赖管理,得先了解相关概念。说明:本文并非Maven文章,只对Maven依赖管理方面的概念做简单科普。
依赖的scope决定其生效的范围,依赖的生效范围共计三种:
scope有多种取值:
compile
: scope缺省值。三种范围都生效,参与打包。例如:spring-coreprovided
: build生效,test生效,runtime不生效,不参与打包。例如:servlet-apiruntime
: build不生效、test生效,runtime生效,参与打包。例如:mysql-connector-java(JDBC驱动)system
: build生效,test生效,runtime不生效,不参与打包。不是从maven仓库引入,而是在本地目录的下的jar,test
: build不生效,test生效,runtime不生效,不参与打包。例如:JUnit、Mockitoimport
:仅仅在dependencyManagement内部才有这个值,它对范围都不生效。用于引入外部依赖,进行依赖管理知识点:runtime不生效的,都不会参与打包,不参与打包就不会参与传递,因为在打包阶段,使用的是运行classpath。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
从结果来看:二者是一样的。都不会被打入包中,依赖不会传递给上层。所以它哥俩的区别在于使用场景上。
最后,分享一个比喻,将二者的区别道出来,我觉得特别好,分享给你:
如图,Maven的依赖传递机制,大大地减少了人工维护间接依赖的复杂度。
至于哪些依赖可以向下继续传递,上个part已经有结论了:参与打包的就可以传递依赖,runtime生效的scope才会参与打包,也就是只有compile和runtime这两个scope能够传递依赖。
Maven管理传递依赖时,绝大部分时候我们无需关心依赖是哪儿来的。只有当依赖出问题时(比如希望是xx版本,但实际进来的是yy版本),才需要搞清楚此依赖是哪条路径进来的,为什么是这条路径。所以,当一个间接依赖来自多个路径时,了解Maven的依赖仲裁策略非常重要,是解决此问题的关键。
Maven依赖仲裁其实也比较简单,总结一下就两个原则:
优先使用第1原则,当第1原则无法解决时,则通过第2原则决定。举个简单的例子辅助理解一下:
项目A的依赖如下,问:A最终依赖Z的版本号是多少?
A -> B -> C -> D -> Z(1.0) // 路径长度4
A -> X -> Y -> Z(2.0) // 路径长度3
答:2.0。原因:Z(1.0)的依赖路径长度为4,而Z(2.0)路径长度是3,根据路径最短者优先
原则,最终Z的版本号为2.0。
那么,问题来了。在实际生产项目中,这种间接依赖的场景会非常非常多,怎样高效的定位问题所在呢?maven提供了相关依赖分析命令:
虽然命令有了,但分析起来还是不够直观,那么破?
在集成开发环境时代,这种棘手问题肯定早已被解决,它就是:Maven Helper。
它是IDEA的一个插件,可以通过 UI 界面的方式来查 Maven项目的依赖关系,很是直观。由于Java项目大都使用Maven进行管理,所以Maven Helper
几乎可以说是必装插件。
在IDEA 2022.1发布之前,笔者一直使用它。看插件的评分,是我见过的评分最高的插件,非常优秀。
安装好插件后,打开pom.xml文件,可以看到左下角靠右边多了个Dependency Analyzer
:
点击此tab进入Maven Helper的功能区:
如上图所示,commons-lang和jackson-core存在冲突,这里以jackson-core
为例解释冲突的原因以及为何最终仲裁为2.9.9版本。
原因:此依赖存在多个路径,且版本号还不一样:
结果解释:直接依赖的路径长度是1,通过jackson-databind间接依赖的路径是2,按照路径最短者优先原则最终仲裁出来的版本号为2.9.9。
有时候,若就想要2.11.3这个版本生效,或者想解决所有conflicts避免隐患怎么办?这个时候就可以借助exclude来做,使用Maven Helper提供的图形化界面操作非常的方便,在想要排除的地方右键:
点击Exclude后的效果为:
自动帮你把exclusion部分加上去了。然后刷新刚才的视窗,发现此冲突完美解决:
依赖分析和解决冲突是Maven Helper最常用的功能,甚至没有之一。
这个用处,其实没那么的大。毕竟IDEA提供的Maven视窗已足够好用,就算偶尔手敲两个命令也不算麻烦。
还有其它功能比如展示依赖关系图、在当前位置快速启动命令行等,我觉得实用性都不算高,就不做过多介绍了。
那么问题来了,笔者作为Maven Helper的忠实用户,它也确实很好用,为何还将其卸载呢?
一切只因IDEA 2022.1发布了。
JetBrain在2022年4月26日,正式发布了IntelliJ IDEA 2022.1。本次属于大版本升级,对使用者来讲最大的改变就是引入了 Dependency Analyzer
,依赖分析器。
Dependency Analyzer,用于以UI方式管理依赖项和解决冲突。我去,咋一看这就是冲着Maven Helper来的呀,几乎完全重叠有木有。
在IDEA的maven视窗里点击依赖分析按钮,进入依赖分析窗口,如下图所示:
此窗口顶部有多个选项区域,逐个解释:
选择maven模块:对于多模块的项目,这里可以选择按模块处理依赖关系
选择Scope:默认选择所有
是否显示GroupId:多数情况下GroupId都不用显示,所以默认情况下此选项也是没有被选中的
是否只显示有冲突的依赖:
下面重点看看IDEA在冲突上的显示和处理能力,和Maven Helper还是有点不一样的:
请注意理解这个视窗,它和Maven Helper的Conflicts是有明显区别的。IDEA的是:
注意对比下面窗口列表和👆🏻的不同,这里表示最终生效的版本号:
笔者个人认为,这种显示方式是优于Maven Helper的,很是直观。真可谓JetBrain出品,必属精品。
奈何,有个小小缺陷:当我想要通过exclusion方式去解决冲突的jar时,它并不能“一键”帮我完成,而只能导航到问题处自己手动解决:
你觉得IDEA后续会把“该功能”加上来吗?
使用IDEA自带的依赖分析器,打开的pom.xml文件时并不会和Maven Helper一样多出一个tab,而是保持原样:
最后,值得一提的是:IDEA的Dependency Analyzer功能不仅适用于Maven,还适用于Gradle。
最后,值得一提的是:IDEA的Dependency Analyzer功能不仅适用于Maven,还适用于Gradle。
最后,值得一提的是:IDEA的Dependency Analyzer功能不仅适用于Maven,还适用于Gradle。
新版IDEA提供的Dependency Analyzer依赖分析功能,笔者认为不输Maven Helper。重点是前者是原生自带的(且还支持Gradle),后者还得额外安装插件,孰优孰劣高下立判。所以,我头也不回的卸载了Maven Helper,相忘于江湖。
赶紧升级到最新的IDEA 2022.1版本吧,一起体验它的依赖分析工具,以及something else new~
我是方向盘(YourBatman):前25年不会写Hallo World、早已毕业的大龄程序员。高中时期《梦幻西游》骨灰玩家,网瘾失足、清考、延期毕业、房产中介、保险销售、送外卖…是我不可抹灭的黑标签
《Spring奇淫巧技》
序号 | 专栏名称 | 简介 |
---|---|---|
01 | 【方向盘】-程序人生 | 程序人生,人生程序 |
02 | 【方向盘】-资讯/新特性 | IDEA、JDK、Spring技术栈…新特性 |
03 | 【方向盘】-IntelliJ IDEA | 熟练使用IDEA就相当拥有物理外挂,助你高效编码 |
04 | 【方向盘】-Bean Validation | 熟练掌握数据校验,减少90%的垃圾代码 |
05 | 【方向盘】-日期时间 | 帮你解决JDK Date、JSR 310日期/其实 的一切问题 |
06 | 【方向盘】-Spring类型转换 | Spring类型转换-框架设计的基石 |
07 | 【方向盘】-Spring static | static关键字在Spring里的应用 |
08 | 【方向盘】-Cors跨域 | 关于跨域请求问题,本专栏足矣 |
09 | 【方向盘】-Jackson | Almost Maybe是最好的Jackson专栏 |
10 | 【方向盘】-Spring配置类 | 专讲@Configuration配置类,你懂的 |
11 | 【方向盘】-Spring技术栈 | 暂无所属小分类的,Spring技术栈大分类 |
12 | 【方向盘】-JDK | 暂无所属小分类的,JDK技术栈大分类 |
13 | 【方向盘】-Servlet | Servlet规范、Web相关内容专题 |
14 | 【方向盘】-Java EE | 从Java EE到Jakarta EE,30年弹指一挥间 |
15 | 【方向盘】-工具/提效 | 开发工具、软件工具,目标是提效 |
16 | 【方向盘】-Spring技术栈新特性 | Spring Framework、Spring Boot、Spring Cloud、Spring其它技术 |
17 | 【方向盘】-基本功 | 每个Javaer,都需要有扎实的基本功 |
… | … | … |
99 | 源代码库 | 大多数专栏均配有源代码,都在这里 |