当似乎只有一个版本的 Java 可用时,为什么我会收到 LinkageError?

Chr*_*son 11 java java-home linkageerror

这是我的Java环境:

~: java -version
    java version "11.0.1" 2018-10-16 LTS
    Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
    Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
Run Code Online (Sandbox Code Playgroud)

但是,当编译后尝试执行程序时,出现以下错误:

Error: LinkageError occurred while loading main class ClassName
    java.lang.UnsupportedClassVersionError: ClassName has been 
    compiled by a more recent version of the Java Runtime 
    (class file version 55.0), this version of the Java Runtime 
    only recognizes class file versions up to 54.0
Run Code Online (Sandbox Code Playgroud)

我的 PATH 和 JAVA_HOME 变量都指向这个版本的 java。我下载了其他版本,但似乎它们没有在系统中注册:

update-alternatives --display java
java - auto mode
  link best version is /usr/lib/jvm/java-11-openjdk-amd64/bin/java
  link currently points to /usr/lib/jvm/java-11-openjdk-amd64/bin/java
  link java is /usr/bin/java
  slave java.1.gz is /usr/share/man/man1/java.1.gz
/usr/lib/jvm/java-11-openjdk-amd64/bin/java - priority 1101
  slave java.1.gz: /usr/lib/jvm/java-11-openjdk-amd64/man/man1/java.1.gz
Run Code Online (Sandbox Code Playgroud)

那么为什么编译和执行是不同的版本呢?

小智 6

我在 eclipse 中遇到这个错误:

LinkageError occurred while loading main class com.example.demo.SpringDemo1Application
    java.lang.UnsupportedClassVersionError: com/example/demo/SpringDemo1Application has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 60.0
Run Code Online (Sandbox Code Playgroud)
  1. 右键单击项目名称
  2. 选择属性
  3. 选择Java编译器
  4. 单击恢复默认值。
  5. 应用并关闭。

这对我有用。

在此输入图像描述


Chr*_*son 5

问题是其他下载的 Java 版本可以通过我的 PATH 变量访问。因此,在编译和执行我的程序时指定 javac 和 java 可执行文件的完整路径后,它就可以工作了。