【转载】Java 14都快出来了,为什么还有那么多人执着于Java 8?
作者:blindpirate
链接:https://www.zhihu.com/question/360985479/answer/956242314
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
啊哈哈哈哈,这题我会!2018年我有一大部分工作都在和Java 9 作斗争!Java 9是2017年9月发布的,而我们一直到2018年9月——花了整整一年的时间——才切换到Java 9,又花了三个月的时间切换到Java 11。
反观JetBrains,似乎花了两年多才把runtime升级到11(假设他们是从Java 9一发布就升了),我们和JB的代码规模差不多,都是百万级别的,现在你应该对升级这事的周期有一个基本的认识了吧?
总结一下,就是Java 9各种奇怪的改变+业界长久积累的库中的瞎JB用法导致了大部分项目被迫停在Java 8上。我强烈建议把题目改成「为什么还有那么多人被迫使用Java 8」,因为,这真的是客观原因啊。
我举几个栗子让你们看看迁Java 9/11这件事情有多蛋疼,算是给想迁移的你们提前打个预防针。
Java 9之前,Java的版本号用的是这个标准,也就是我们常见的1.8.0_213
这种字符串。 Java 9之后,大家一拍大腿,反正已经做了这么多改变,不差这一个!来人啊!给我把这个版本号字符串换掉!于是有了JEP223,一个山寨版的语义化版本号,从此以后,版本号大概长这个样子:9.0.0.4
。平心而论,这个变更是非常必要的,但是一众依赖以前的版本号字符串的库就都哭了……谁能想到你丫的连这种东西都变啊。
(据说当年还有人提议以后Java的版本号跟业界保持一致,用18.1
/19.1
之类的年份+次序命名 ,后来就没声音了,应该是被打死了。)
那些广为人知的大库还好说,改的还算及时,一些小作坊生产的三无库就惨了,一调用就给你丢个Illegal version number 9.0.0.4
出来, 还找不到人修,来来来你说咋办?
Java 8之前对反射没有限制,只要setAccessible(true)
,你连JVM的底裤都可以掀掉。我们都知道,一旦给用户自由,用户就会瞎JB用。大家都知道JVM初始化的时候传进来的环境变量是不可变的,存在ProcessEnvironment
的一个不可变Map里。但是没关系,我有反射啊……
其他的栗子还包括,通过反射调用各种私有的API……在你升级之前,你永远不知道有多少地方在用这种鬼鬼祟祟的操作……升级就好像你面前的一条康庄大道,你开开心心地踏上去准备走,咚!一个地雷炸了!piaji!你掉坑里了!二十米的路你走了三个月!黑着脸从坑里爬出来,瞅瞅前面……这特么还有多少个地雷在等着我啊……在爆炸之前你永远不知道到底有多少库在用反射偷偷摸摸调私有API,我管它叫薛定谔的反射。
这都是业界的库里的骚操作(其实我们的代码里也有……捂脸),Java 9对反射添加了限制。JDK团队最初计划在Java 9中全面限制反射,但最后因为影响太大没能实行……
还有最常用的一个操作叫做defineClass
,用来把魔改后的字节码注入ClassLoader。ClassLoader的这个方法是protected
的,没关系,我们有反射啊……另外一些小伙伴直接用反射调用Unsafe.defineClass
——看名字你就知道有多不安全,Java 11之后这个方法直接被干掉了。
能用到这些方法的库通常都是大厂生产的有售后的库,所以通常都能得到很好的解决。但是紧接着问题就来了——你把一个库从2011年的版本直接升到了2018年的版本,你心里慌不慌?
更别提有些小作坊的库偷偷摸摸地从裤裆里掏出来一个Unsafe.defineClass
跟你哭丧着脸说,哥,这个方法我找不到了,咋办……
在升Java 9成功之后,怀抱着升级成功的窃喜,我们又趁热打铁想升Java 10。然后碰到了IDEA的一个bug:IDEA错误地理解了一个还未生效的草案JEP182,编译器给出了不正确的结果,我花了一上午时间调试IDEA的源代码才发现是IDEA的锅。IDEA尚且如此,其他项目碰到兼容性问题,真的只是时间问题。
业界的很多工具不支持Java 9,最广为人知的应该是FindBugs了。还好,它还算后继有人,SpotBugs挑起了它的大梁,那些小作坊库可就惨了,过去的十年是Java生态系统迅猛发展的十年,你的项目只要沾到一点“在自己的代码里瞎JB使用Java 8/断言自己使用的是Java 8”的库,可能就要花上几天时间去调试、去尝试解决。
最后,最重要的一点是,我们的代码是有严格的自动化测试覆盖的,所以我们在升级之后能非常有底气地说我们升级成功了!对于没有测试覆盖的祖传代码,你升级完事,跑一下,似乎没问题,但是真的没问题么?去问老天爷吧……没有完善的测试覆盖的项目请勿轻易尝试。
其实升级不是什么非常困难的事情,主要是费时费力,收益可能却没有那么明显。对于一个成熟的公司来说,代码只是辅助业务的手段,而非目的。如果没有十分的利益保证,别说升级,连bug都是可以不修的。就酱。
【转载】Java 14都快出来了,为什么还有那么多人执着于Java 8?相关推荐
- Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了. 每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,Java 1 ...
- 2022年都快完了,还学Access的人是不是傻?
2022年都快完了,还学Access的人是不是傻?这是某问答平台,讨论火热的话题. 该问题下,部分程序员拍手称好,对Access语言充满不屑,认为Access过时该被淘汰,笔者作为开发者,并不赞同. ...
- 创业公司这三年,Java老本都快吃完了!
最近跟一些读者交流,有一位读者的经历让我记忆深刻: "有一次和大学同学聚会,和几个在 BAT 的同学聊了聊技术,发现自己在创业公司这几年,完全是吃老本的状态,没有什么机会精进技术,同样是工作 ...
- 为什么 Java/JDK 都快出 18 了,还有人用 1.8 呢?
本文不从语法和技术角度说明jdk1.8和18或其它高版本的差别,先问如下的问题请大家思考下. 1 在项目里为什么要用Java?如何选用版本? 用java为了通过做项目挣钱,客户方只管功能,不管实现,所 ...
- Java 18 都要来了,你不会还在用Java 8吧?
DD正在掘金打榜,老规矩!最后奖品都会给分给读者 你不来支持一下?投票入口: 点击参与活动 作者 | 罗奇奇 来源 | OSC开源社区(ID:oschina2013) Java 开发工具包 (JDK) ...
- Java 14 中令人期待的五大新特性!
随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. 作者 | Sylvain Saurel 译者 | 苏本如,责编 | 郭芮 出 ...
- Java 14:JDK 14进入GA时的所有新功能
是的,六个月过去了这么快,现在到了,Java 14的发布即将到来. 我们一直在跟踪新JDK在过去半年中的进展,您可以在此处找到摘要的所有功能. 但是,如果您想直接进入,可以在此处找到JDK 14二进制 ...
- Java 14的新功能
2020年3月17日,Oracle发布了名为Java 14的Java新版本,其中包括许多新功能,工具,安全性,调试和更新的文档方面的改进. 但是,Oracle还向您提供Java的较旧版本,因为它具有向 ...
- Java 14 来了!
整理 | 弯月,责编 | 郭芮 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 近日,Oracle发布了Java 14版,这是自从Java采用六个月一次的发布周期之后 ...
最新文章
- 爬虫,如何防止被ban之策略大集合
- 统计学习方法第二十一章作业:PageRank迭代算法、幂法、代数算法 代码实现
- vscode Python 运行环境配置
- c语言中字符数字加'0',C语言中的NULL与转义字符'\0'以及数值0的关系
- vue-cli+webpack在生成的项目中使用bootstrap的方法
- break、continue
- MySQL数据库优化概述
- 学生寝室管理系统-C语言版
- cm agent主机异常Error, CM server guid updated, expected
- 查看oracle操作历史,查看操作历史记录
- blk-mq 进行多重队列
- 如何让好习惯成为你人生中的一部分
- C语言 计算平均成绩
- studio 3t注册码脚本
- Python | Numpy:详解计算矩阵的均值和标准差
- Three.js实现的网站页面金字塔模型显示
- java实现,如何在当前时间往后推三十天
- 提高抗打击能力_如何提高心理承受能力或者抗打击能力?
- NO.25-SAP S4 HANA Cloud EX版本介绍
- sybase备份学习总结
热门文章
- 网络营销存在的安全问题
- 【Linux Centos6/7 Oracle11g数据库开启归档日志功能】
- Spark问题14之Spark stage retry问题
- toad连接数据库时报错 cannot load OCI DLL
- python读二进制格点雷达基数据_radar: 基于python pycinrad 以及多种类库 编写基于java 的雷达基数据统一格式读取...
- MYSQL分区表如何保证数据唯一性
- 关于Ember的一些小技巧总结
- 第8周 项目5 定期存款利息计算器
- java sortmap分析_Java编程中的SortedMap接口
- qcon_从QCon San Francisco 2009中学到的重点知识和教训