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
。但是有一些编译或运行时的错误,所以我不得不升级一些库:
- gradle:
1.9
到 1.10
- spring:
3.x
到 4.x
那是因为他们使用的是一些早期版本的 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 与旧版应用程序的兼容性非常好。他们必须让所有企业客户牢记这一点。
最近,我们在我的一个 Java 项目中将 Jdk 版本从 1.6
升级到 1.8
。但是有一些编译或运行时的错误,所以我不得不升级一些库:
- gradle:
1.9
到1.10
- spring:
3.x
到4.x
那是因为他们使用的是一些早期版本的 ASM,但只支持 5.x
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 与旧版应用程序的兼容性非常好。他们必须让所有企业客户牢记这一点。