【发布时间】:2015-03-29 11:45:03
【问题描述】:
最近,我们在我的一个 Java 项目中将 Jdk 版本从 1.6 升级到 1.8。但是有一些编译或运行时错误,所以我不得不升级一些库:
- gradle:
1.9到1.10 - 弹簧:
3.x到4.x
那是因为他们使用了一些早期版本的 ASM,但仅支持来自 5.x 的 jdk 1.8
Java说是向后兼容,但是为什么原版的库不能直接用jdk 1.8呢?
【问题讨论】:
-
Java 8 字节码不能在 Java 6 JVM 上运行——这不是向后兼容的意思。同理,Java 8 字节码也不能被专为 Java 6 字节码设计的库处理。
-
@LưuVĩnhPhúc 没有新的指令,但这并不意味着字节码格式没有改变(它已经改变了!)
-
简而言之,ASM 库故意公开地不遵守代码必须满足的前提条件,以保证应用二进制兼容性。
-
@Lưu Vĩnh Phúc:这取决于您对口语术语“字节码”的含义。没有新的指令,但是类文件格式发生了变化。
-
@Rogério:取决于您对“类文件格式”的含义。总体结构没有改变,只有新版本号、新属性和关于允许/可能出现在哪些地方的构造的新定义。这足以使某些现有的字节码解析工具崩溃,这就是讨论的内容。附带说明一下,即使 javac 现在使用
invokedynamic指令(这不是 Java 8 的新功能但在普通 Java 7 代码中未使用)这一事实,也会导致一些工具使用 Java 7 代码在 Java 8 代码上失败。
标签: java migration java-8 java-7