Java是向后兼容的,但是为什么我们把jdk从1.6升级到1.8的时候需要升级很多库呢?

Java is backward compatible, but why we need to upgrade many libraries when we upgrade jdk from 1.6 to 1.8?

最近,我们在我的一个 Java 项目中将 Jdk 版本从 1.6 升级到 1.8。但是有一些编译或运行时的错误,所以我不得不升级一些库:

那是因为他们使用的是一些早期版本的 ASM,但只支持 5.x

的 jdk 1.8

Java说是向后兼容,但是为什么原来版本的库不能直接和jdk1.8兼容呢?

因为ASM是一个对Java字节码进行操作的工具。并且字节码格式发生变化以引入新功能。因此,您必须升级该工具以支持新的字节码。

请注意,使用较旧版本的 JDK 编译的软件并不总是 与较新版本的 Java 一起使用。例如,enum 在 JDK.

的早期版本中不是关键字

ASM 是一个非常低级的库。

它直接处理 Java 字节码(而 "normal" 应用程序只会让 JVM 加载它的 classes)。字节码格式不时发生变化,较旧的 JVM 无法使用较新的版本。

乱用 JDK 或 class 格式内部构件不在向后兼容性范围内。

这确实是一个边缘案例,ASM 几乎是唯一的 "popular" 示例。


更重要(也更常见)的是系统库代码中的细微行为变化。因此,您的应用程序在技术上仍将 运行,但会以不同的方式做事。大多数时候,你想要它,因为它意味着改进(例如更好的性能),但有时它会给你带来错误。

例如:

  • 切换到 64 位 JVM 可以require more memory
  • 垃圾回收的变化可能导致意外暂停
  • 将 XML 解析器包含到 JDK 中需要更改 Web 应用程序打包或配置
  • String#substring 的内存和运行时间特性在 "minor" JDK 修订
  • 中完全改变
  • 突然用自定义(未正确实现)比较器对集合进行排序throws exceptions它之前没有抛出
  • 自从 Java 8
  • 以来,调用 Thread#stop(Throwable)(这从来都不是一个好主意,并且已经被弃用了很长时间)会引发 UnsupportedOperationException
  • 更新的 Unicode 支持更改某些字符串的排序和大小写行为
  • generics compilation
  • 的变化
  • 还有许多其他人 changes in API and BPI

但总的来说,Java 与旧版应用程序的兼容性非常好。他们必须让所有企业客户牢记这一点。