近期我们升级了Jdk版本1.6
to 1.8
在我的一个 Java 项目中。但有一些编译或运行时错误,所以我必须升级一些库:
- gradle:
1.9
to 1.10
- spring:
3.x
to 4.x
这是因为他们使用的是 ASM 的一些早期版本,但仅支持 jdk 1.85.x
Java说是向下兼容的,但是为什么原来版本的库不能直接使用jdk 1.8呢?
ASM 是一个相当低级的库。
它直接处理 Java 字节码(而“普通”应用程序只会让 JVM 加载其类)。字节码格式会不时发生变化,较旧的 JVM 无法使用较新的版本。
向后兼容性不包括对 JDK 或类格式内部的破坏。
这确实是一种边缘情况,ASM 几乎是唯一“流行”的例子。
更重要(也更常见)的是系统库代码的轻微行为变化。因此,您的应用程序在技术上仍然可以运行,但会以不同的方式执行操作。大多数时候,您希望如此,因为这意味着改进(例如更好的性能),但有时它可能会给您带来错误。
例如:
- 切换到 64 位 JVM 可以需要更多内存
- 垃圾收集的变化可能会导致意外的暂停
- 将 XML 解析器包含到 JDK 中需要更改 Web 应用程序打包或配置
- String#substring 的内存和运行时特性在“次要”JDK 修订中完全改变
- 突然使用自定义(未正确实现)比较器对集合进行排序抛出异常它之前没有抛出
- 从 Java 8 开始,调用 Thread#stop(Throwable) (这从来都不是一个好主意,并且已被弃用很长一段时间)会抛出 UnsupportedOperationException
- 更新了 Unicode 支持更改某些字符串的排序和大小写行为
- 改变在泛型编译
- 由于新的默认方法,无法扩展 BitSet 并实现 Set
- 舍入行为的变化
- 还有许多其他人API 和 BPI 的变化
但总而言之,Java 的遗留应用程序兼容性非常好。他们必须让所有企业客户牢记这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)