我有以下设置:
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版本:
Java8: 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是用Java9编译的:
d:\jdk9\bin>javac d:\test\A.java
然后,使用Java9编译的A类使用Java8编译B.java:
测试-cp d:\ d:\jdk8\bin>javac d:\test\B.java
警告: d:\test\A.class:主版本53比52新,52是此编译器支持的最高主版本。
建议升级编译器。
1个警告
因此,类文件编译成功,但会出现警告。我刚刚通过手动调用编译器看到了这个警告。如果我使用Maven构建项目,则看不到此警告。
现在使用Java 11编译了A类(与Java 10相同):
d:\jdk11\bin>javac d:\test\A.java
如果我试图编译B类,我得到一个错误:
测试-cp d:\ d:\jdk8\bin>javac d:\test\B.java
d:\test\B.java:3:错误:无法访问A
A classA = new A(); ^错误的类文件: d:\test\A.class
class file has wrong version 55.0, should be 52.0 Please remove or make sure it appears in the correct subdirectory of the classpath.1个错误
因此,从技术上讲,在Java 8中使用Java 9编译的类文件是可能的,但我认为这是不可能的。
发布于 2018-12-21 18:25:15
Java9编译器javac可能是为Java8编译的;您可以使用较新的编译器来编译较旧的.class版本。查找-target和-source 1.8。
IDE或maven/gradle是为旧版本配置的。
https://stackoverflow.com/questions/53881551
复制相似问题