作者: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?相关推荐

  1. Java 14 都快来了,为什么还有这么多人固守Java 8?

    从Java 9开始,Java版本的发布就让人眼花缭乱了. 每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,Java 1 ...

  2. 2022年都快完了,还学Access的人是不是傻?

    2022年都快完了,还学Access的人是不是傻?这是某问答平台,讨论火热的话题. 该问题下,部分程序员拍手称好,对Access语言充满不屑,认为Access过时该被淘汰,笔者作为开发者,并不赞同. ...

  3. 创业公司这三年,Java老本都快吃完了!

    最近跟一些读者交流,有一位读者的经历让我记忆深刻: "有一次和大学同学聚会,和几个在 BAT 的同学聊了聊技术,发现自己在创业公司这几年,完全是吃老本的状态,没有什么机会精进技术,同样是工作 ...

  4. 为什么 Java/JDK 都快出 18 了,还有人用 1.8 呢?

    本文不从语法和技术角度说明jdk1.8和18或其它高版本的差别,先问如下的问题请大家思考下. 1 在项目里为什么要用Java?如何选用版本? 用java为了通过做项目挣钱,客户方只管功能,不管实现,所 ...

  5. Java 18 都要来了,你不会还在用Java 8吧?

    DD正在掘金打榜,老规矩!最后奖品都会给分给读者 你不来支持一下?投票入口: 点击参与活动 作者 | 罗奇奇 来源 | OSC开源社区(ID:oschina2013) Java 开发工具包 (JDK) ...

  6. Java 14 中令人期待的五大新特性!

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. 作者 | Sylvain Saurel 译者 | 苏本如,责编 | 郭芮 出 ...

  7. Java 14:JDK 14进入GA时的所有新功能

    是的,六个月过去了这么快,现在到了,Java 14的发布即将到来. 我们一直在跟踪新JDK在过去半年中的进展,您可以在此处找到摘要的所有功能. 但是,如果您想直接进入,可以在此处找到JDK 14二进制 ...

  8. Java 14的新功能

    2020年3月17日,Oracle发布了名为Java 14的Java新版本,其中包括许多新功能,工具,安全性,调试和更新的文档方面的改进. 但是,Oracle还向您提供Java的较旧版本,因为它具有向 ...

  9. Java 14 来了!

    整理 | 弯月,责编 | 郭芮 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 近日,Oracle发布了Java 14版,这是自从Java采用六个月一次的发布周期之后 ...

最新文章

  1. 爬虫,如何防止被ban之策略大集合
  2. 统计学习方法第二十一章作业:PageRank迭代算法、幂法、代数算法 代码实现
  3. vscode Python 运行环境配置
  4. c语言中字符数字加'0',C语言中的NULL与转义字符'\0'以及数值0的关系
  5. vue-cli+webpack在生成的项目中使用bootstrap的方法
  6. break、continue
  7. MySQL数据库优化概述
  8. 学生寝室管理系统-C语言版
  9. cm agent主机异常Error, CM server guid updated, expected
  10. 查看oracle操作历史,查看操作历史记录
  11. blk-mq 进行多重队列
  12. 如何让好习惯成为你人生中的一部分
  13. C语言 计算平均成绩
  14. studio 3t注册码脚本
  15. Python | Numpy:详解计算矩阵的均值和标准差
  16. Three.js实现的网站页面金字塔模型显示
  17. java实现,如何在当前时间往后推三十天
  18. 提高抗打击能力_如何提高心理承受能力或者抗打击能力?
  19. NO.25-SAP S4 HANA Cloud EX版本介绍
  20. sybase备份学习总结

热门文章

  1. 网络营销存在的安全问题
  2. 【Linux Centos6/7 Oracle11g数据库开启归档日志功能】
  3. Spark问题14之Spark stage retry问题
  4. toad连接数据库时报错 cannot load OCI DLL
  5. python读二进制格点雷达基数据_radar: 基于python pycinrad 以及多种类库 编写基于java 的雷达基数据统一格式读取...
  6. MYSQL分区表如何保证数据唯一性
  7. 关于Ember的一些小技巧总结
  8. 第8周 项目5 定期存款利息计算器
  9. java sortmap分析_Java编程中的SortedMap接口
  10. qcon_从QCon San Francisco 2009中学到的重点知识和教训