在过去的两年里,我做了一些没有人想到的事情。我将代码从JDK 8到JDK 16更新。在我在Netflix完成的所有事情中,这是我最疑问和最惊人的最疑问的一件事。 “你是怎么做到的?”
如果您不熟悉Java,Oracle会使Java现代化的艰难决定。在Tojava 9之前,主要版本每隔几年一次出现一次,并且具有相对较小的破坏变化。在Java 9中改变了所有的打破。主要版本将突破,每6个月出来一次。
但是,与Python 3000不同,Java的破坏变化非常有限。只有JVM内部会受到限制或删除。就是这样。所有现有的语言功能都是仍然可用的。所有JVM字节码和类仍然有效。想用1995号写的课程吗?如果它不依赖于太阳。*代码,很高兴!
但是,这也是为什么这么多人认为升级是不可能的。这么多Java代码在那里与JDK Internals采取了自由。想要使用sun.misc.unsafe?这是你的。想要修改Final(A.k.a. const)字段?它只是一点反射。想要将某些类注入JDK ClassLoader?没有人会阻止你。
在API边界中没有牙齿,Java 8几乎让应用程序和图书馆所有者做Whatthey想要的。 Guice,Guava,Jackson,Groovy,Gradle,Cglib,Mockito,Lombok,Errerprone,以及其他与JVM的胆量的快速和松散的杂志。是的,他们的代码更快。 Butno,这不是一个长期的胜利。
这是一个努力工作一个Java的棘手的决定。 Java可以改进,添加功能,提高VM,但它会以突破生态系统的成本。声称赢的Many图书馆将不得不给他们回来。替代方案将被保存,但每个人都必须协调全球,向后兼容,多版本upplade。每个图书馆都不需要重写才能产生其收益。尽管如此,应用程序需要等待每个库,他们依赖于实现这一移动。
具有强大,可执行的API边界是长期改进所必需的。 ShortTerm赢得,同时诱人,通常与非标准或不受支持的行李带来。斯特瑞特是今天,它更为普遍的是未来。
即使在标准或规格的主持下,也脱离功能,即它。如果它曾经工作过,你打破它,这是你的错。
当我加入Netflix时,没有人告诉我,无法从Java 8到11升级。我刚刚开始使用它。当事情不起作用(而且它们肯定没有!)11,我去了并检查了我需要更新库。我在自己的机器上做到这一点是一个背部刻录机项目,与主仓库分开。一个接一个,所有非工作库都更新到果子中。当库不是Java 11兼容时,我在GitHub上提交了一个PR来修复它。而且,普通的声音,当没有更破碎的东西时,只有工作的东西都留下了!
只有在我推动这些改变之后,我发现了我所做的是不可能的。诺瑞的人问我如何发生这种情况。某人或某些团队,看过更新数百个项目,可能是数百个图书馆的追逐任务,并留下了希望。就像一个毒药安慰剂,人们对不可能的看法实际上取消了它。让这些障碍社交,你最终得到了一家整个公司寻找ItinsurMountable。
当我告诉他们我如何修复它时,他们通常会失望。 “刚更新了库?”他们会问,寻找更深的东西。 Java 11升级到但不是非常令人徒次的。我的方法与缺乏绝望之间的唯一区别。
我提出了这个故事来提高对他人使用最新和最伟大的掌握的信心。一个月前,我将代码更新为Java 15,上周到16.它会变得更容易。一旦你接近最新版本,那就留在那里没有挑战。由于Alonly破坏的变化是隐藏JVM内部的,因此我们不再使用那些,这是琐碎的尖端。作为奖励,我们获得过去几年送达的所有高级功能(更好的JIT,GC,语言特征等)。
我鼓励你看看更新,因为它可能比你想象的更容易!