当前位置:首页 > 科技  > 软件

不知道 Maven 的这个特性,你迟早要被坑

来源: 责编: 时间:2024-01-09 08:52:41 297观看
导读Apache Maven 是一个自动化构建工具,广泛应用于 Java 项目,它可以帮助我们管理项目的构建、报告和文档,但最重要的功能之一是依赖管理。只要正确配置了项目的依赖,Maven 在编译的时候就可以自动下载项目所需的所有依赖项

Apache Maven 是一个自动化构建工具,广泛应用于 Java 项目,它可以帮助我们管理项目的构建、报告和文档,但最重要的功能之一是依赖管理。4uS28资讯网——每日最新资讯28at.com

只要正确配置了项目的依赖,Maven 在编译的时候就可以自动下载项目所需的所有依赖项。但是如果我们使用不当,依赖管理可能会引入问题,特别是当我们使用如 [2.3.0,)  这样的版本范围指定的时候。4uS28资讯网——每日最新资讯28at.com

这样的写法意味着依赖的版本要大于等于 2.3.0,但不指定最大版本,maven 在编译的时候会自动去查询当前最新的版本,这就很大程度上可能会引入了最新的版本,导致项目依赖不固定,从而引发编译异常。4uS28资讯网——每日最新资讯28at.com

Maven 版本范围介绍

在 Maven 的依赖管理中,我们可以为依赖项指定一个版本范围。例如,[1.0,2.0]意味着版本范围介于 1.0 和 2.0 之间(包含)。[1.0,2.0) 意味着版本范围介于 1.0 和 2.0 之间,但不包含 2.0。[2.3.0,)则表明我们接受 2.3.0 或更高的版本,此时我们并没有指定范围的上限,而是让 Maven 选择满足这个条件的最新版本。4uS28资讯网——每日最新资讯28at.com

图片图片4uS28资讯网——每日最新资讯28at.com

版本范围带来的问题

对于某些类型的项目,如开源项目,使用范围可能是合理的,因为开源项目通常希望能够方便地采用最新的库和工具。4uS28资讯网——每日最新资讯28at.com

然而,对于需要保证稳定性的商业项目,使用无上限的版本范围可能导致问题。每次构建项目时,Maven 都会尝试获取新的依赖版本。如果新版本引入了不兼容的更改,可能导致编译错误,甚至更微妙的运行时错误。4uS28资讯网——每日最新资讯28at.com

由于同一项目的不同开发者可能在不同的时间点执行编译,他们可能获得的依赖版本不同,从而导致难以追踪的问题。4uS28资讯网——每日最新资讯28at.com

而作为公司内部的软件,很多时候我们是需要保证稳定的,所以就很不适合采用范围来配置 maven 版本了。4uS28资讯网——每日最新资讯28at.com

如下所示,我这边原本的配置 fastjson 的版本是 1.2.79,从右侧的 maven 依赖中我们可以看到,项目中下载的 fastjson 的版本是 1.2.79。4uS28资讯网——每日最新资讯28at.com

图片图片4uS28资讯网——每日最新资讯28at.com

如果此时我把 fastjson 的版本调整成 [1.2.79,) 的形式,则右侧的依赖就会变成一个最新的 2.0.45 这个版本。4uS28资讯网——每日最新资讯28at.com

图片图片4uS28资讯网——每日最新资讯28at.com

image-20240107150146630这种写法除了依赖中会获取到最新的版本之外,其实 maven 是把整个范围的 jar 都下载下来了,通过本地的资源仓库我们可以看到只要版本在这个范围之内,都会被下载下来。4uS28资讯网——每日最新资讯28at.com

图片图片4uS28资讯网——每日最新资讯28at.com

另外如果一些软件自身的升级是向下兼容的,那么使用范围版本配置可能没什么关系,但是如果一些软件的版本不是向下兼容的,那么使用范围版本配置那肯定是有问题的。4uS28资讯网——每日最新资讯28at.com

特别是随着 JDK 版本的升级,很多新的依赖的开发和编译可能是采用新版本的 JDK 来实现的,这个时候如果我们自身项目的 JDK 还是旧版本的话,就会出现项目编译不通过的问题了,会提示 JDK 版本不对,这种在编译的时候往往会出现 Java – Unsupported class file major version  异常。4uS28资讯网——每日最新资讯28at.com

所以下次如果出现这种异常,可以考虑看看是不是 maven 版本依赖配置问题。4uS28资讯网——每日最新资讯28at.com

如何解决明确版本问题

最简单和最直接的方法是将依赖的版本明确指定,而不是提供一个范围。4uS28资讯网——每日最新资讯28at.com

这样,所有开发者和构建服务器都将使用相同的依赖版本。当我们决定升级依赖时,可以测试新版本,对代码进行必要的更改,然后在进行升级。4uS28资讯网——每日最新资讯28at.com

Maven 也支持所谓的版本管理(version management)。在父 POM 中,我们可以用 <dependencyManagement> 元素定义一个或多个依赖项的版本,然后在项目的各个模块中引用它们,无需在每个模块中指定版本。这种方法对于确保项目的各个部分使用相同的依赖版本非常有效。4uS28资讯网——每日最新资讯28at.com

结论

虽然范围版本提供了寻找需要的库的新版本的方便,但大范围的未定版本和更新可能会引入不希望的结果,这些结果可能导致编译异常或者运行时错误。4uS28资讯网——每日最新资讯28at.com

我们需要使用正确的方法来管理和锁定我们的依赖,避免这些困扰,并保持我们的项目的稳定性。4uS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-58970-0.html不知道 Maven 的这个特性,你迟早要被坑

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python 的 Shutil 模块,你都了解多少?

下一篇: 如何用Rust架构复杂系统?

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
Top