【发布时间】:2018-12-21 08:39:35
【问题描述】:
我有以下设置:
A 类 - 使用 java 9 编译(类版本 53)
B 类 - 应使用 java 8(类版本 52)编译
B 类依赖于 A 类。
现在我得到了一个令人惊讶的结果: 我可以使用 Java 8 成功编译 B 类,尽管它依赖于 Java 9 编译的 A 类。
如果我使用 Java 10 或 Java 11 编译 A 类,然后尝试使用 Java 8 编译 B 类,我会收到预期的错误消息:
类文件的版本错误 55.0(或 54.0),应该是 52.0
那么谁能解释一下为什么我没有收到消息
类文件的53.0版本错误,应该是52.0
如果我尝试将 Java 8 与 Java 9 类一起使用?
我使用这个 java 版本:
Java 8:Oracle jdk 1.8.0_144(安装在文件夹 d:\jdk8)
Java 9:Oracle jdk 9.0.1(安装在文件夹 d:\jdk9)
Java 11:Oracle jdk 11.0.1(安装在文件夹 d:\jdk11)
为了演示它,我创建了这两个类文件:
文件 A.java:
public class A {
public void test() {
System.out.println("Class A");
}
}
文件 B.java:
public class B {
public static void main(String[] args) {
A classA = new A();
classA.test();
System.out.println("Class B");
}
}
第一个 A.java 是用 Java 9 编译的:
d:\jdk9\bin>javac d:\test\A.java
然后 B.java 使用 Java 8 编译,使用 Java 9 编译的 A 类:
d:\jdk8\bin>javac -cp d:\test d:\test\B.java
警告:d:\test\A.class: 主版本 53 比 52 新,这是此编译器支持的最高主版本。
建议升级编译器。
1 个警告
所以类文件编译成功并出现警告。我刚刚通过手动调用编译器看到了这个警告。如果我使用 Maven 构建项目,
此警告不可见。
现在 A 类是用 Java 11 编译的(与 Java 10 相同):
d:\jdk11\bin>javac d:\test\A.java
如果我尝试编译 B 类,我得到一个错误:
d:\jdk8\bin>javac -cp d:\test d:\test\B.java
d:\test\B.java:3: 错误:无法访问 A
A 类 A = 新 A();
^
错误的类文件:d:\test\A.class
类文件有错误的版本 55.0,应该是 52.0
请删除或确保它出现在类路径的正确子目录中。
1 个错误
所以从技术上讲,Java 8 可以使用 Java 9 编译的类文件。但我认为这是不可能的。
【问题讨论】:
-
我假设您在谈论某种库?你能给出发生这种情况的具体情况吗?
-
你的机器上的
javac和java版本是什么,你在哪里编译B类? -
你如何编译你的类?
-
我在最初的帖子中添加了带有示例的编译器版本。
标签: java unsupported-class-version