【问题标题】:Troubleshooting UnsupportedClassVersionError in IntelliJ IDEAIntelliJ IDEA 中的 UnsupportedClassVersionError 故障排除
【发布时间】:2019-12-13 10:27:19
【问题描述】:

我正在学习使用 Intellij IDEA 的 Java 课程。在这个“测试”项目中,我只有两个测试类,如下所示(它们真的没有任何代码)。 在我进入问题之前,我只需要声明我所有的项目都可以正常运行,只是我在运行终端命令时遇到了以下问题,我担心我的 IDE 搞砸了:

当我需要使用以下命令获取类 BankAccount 的串行版本时,就会出现问题:

E:\Software Projects\Test\out\production\Test>serialver com.company.BankAccount

我收到如下所示的错误,并且我了解这些类是由较新的 Java 运行时错误编译的,但是如何在 Intellij 中解决此问题?在任何项目中的任何类上运行命令时,我都会遇到同样的错误。

附加说明:使用 java com.company.Main 在终端中运行 Main 类时,我也收到与此相关的错误

我认为可能是问题的原因:在第一次尝试“serialver”之前,我更改了项目文件夹的名称(我只是在 Windows 的文件资源管理器中使用了“重命名”,它在 Intellij 中搞砸了一切(无论我打开什么项目,它都没有 SDK,也没有运行/调试配置)。所以,我在项目上选择了“添加 SDK”(或类似的东西,并从列表中选择了 JRE 12。 然后我运行“Debug Main”并自动设置了运行/调试配置。

当我转到项目结构 > 项目设置 > SDK 时,我只有一个 SDK:"C:\Program Files\Java\jdk-12.0.1"。

当我在项目中转到“运行/调试配置”时,在应用程序的 JRE > Main 我有以下选择(但据我了解,这些都是同一个 SDK,对吗?) :

  • 默认(12 - “测试”模块的 SDK)
  • 12(java版本“12.0.1”)
  • “C:\Program Files\Java\jdk-12.0.1”

所以我不知道如何在这里调整任何东西?我如何能够在任何时候在更新的 Java Runtime 版本上编译这些类?

这里的问题是我不确定是否还有其他问题,或者我之前所做的调整是否搞砸了。

课程:

package com.company;

public class Main {

    public static void main(String[] args) {
    // write your code here
    }
}

package com.company;

public class BankAccount {
}

跑步时 E:\Software Projects\Test\out\production\Test>serialver com.company.BankAccount

我在终端得到的是以下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/company/BankAccount has been compiled by a more recent version of the Java Runtime (class file version 56.
0), this version of the Java Runtime only recognizes class file versions up to 55.0
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at jdk.compiler/sun.tools.serialver.SerialVer.resolveClass(SerialVer.java:108)
        at jdk.compiler/sun.tools.serialver.SerialVer.serialSyntax(SerialVer.java:80)
        at jdk.compiler/sun.tools.serialver.SerialVer.main(SerialVer.java:188)

使用E:\Software Projects\Test\out\production\Test>java com.company.Main 运行主类时出错:

Error: LinkageError occurred while loading main class com.company.Main
        java.lang.UnsupportedClassVersionError: com/company/Main has been compiled by a more recent version of the Java Runtime (class file version 56.0), this version of the Java Runtime only recognizes class file versions up to 55.0

【问题讨论】:

  • 你有this option enabled吗?您项目中的source/target level 设置是什么?
  • 我启用了“将编译器用于模块目标...”。在 Project bytecode version 下,我没有选择任何内容,所以我现在尝试选择 12 和 13。在“Per-module bytecode version:”下,我选择了“Same as language level”的模块,但仍然出现相同的错误。跨度>
  • 您使用什么 IntelliJ IDEA 版本?请分享Minimal, Complete, and Verifiable example
  • 我正在使用 Intellij IDEA 2019.2。除了上面的内容,我不知道关于这个话题我还有什么可以分享的。该示例的代码非常少,并且产生了相同的错误(至少在我的 IDE 上是这样)。附言抱歉,回复有点晚。此外,我尝试通过终端运行 Main 函数,并得到明显与同一问题相关的错误(我会将此错误添加到帖子中)
  • 压缩并共享项目目录。

标签: java intellij-idea unsupported-class-version java-runtime-compiler


【解决方案1】:

在命令行中运行java -version。如果不是 Java 12 或更高版本,它将解释该问题。您的目标是 Java 12 版本,同时在较旧的 Java 版本上运行。

解决方案是 adjust the target language level 以便您的代码可以在较旧的 Java 版本上运行,或者调整您的 PATH 环境,以便 JDK 12 安装目录中的 java 是第一个。或者您可以在尝试运行代码时在命令行中指定java.exe 的完整路径:

E:\Software Projects\Test\out\production\Test>"C:\Program Files\Java\jdk-12.0.1\bin\java.exe" com.company.Main

【讨论】:

  • 我能够使用你所说的完整命令运行它。我已将目标级别调整为 12,但除非我运行完整命令,否则仍然无法使用它。但我想我们已经跟踪了我的问题,这是我在运行 java -version 时得到的: openjdk version "11.0.3" 2019-04-16 OpenJDK Runtime Environment (build 11.0.3+12-b304.10) OpenJDK 64- Bit Server VM(build 11.0.3+12-b304.10,混合模式)
  • 现在无论我在项目设置/设置中进行什么更改,它仍然保持 11.0.3。但我认为这可能是解决方案,因为当我转到“Switch Boot Runtime”或“Switch Boot JDK”时,它为我提供了 11.0.3 和 12.0.1,而我的 JDK 目前在两个选项中都选择了 11.0.3 @987654322 @
  • 当我打开“Switch IDE Boot JDK”时,它给了我以下警告:“更改这些值可能会导致 IntelliJ IDEA 出现不必要的行为。请不要更改这些,除非你被问到”。尝试在“Switch IDE Boot JDK”和/或“Switch Boot Runtime”中从 11.0.3 更改为 12.0.1 对我来说安全吗?
  • 更新:我已将“Switch Boot Runtime”从 build 11.0.3 更改为 build 12.0.1,现在一切正常!当我转到“Switch IDE Boot JDK”而不是 11.0.3 时,它现在显示“”。我也可以选择 12.0.1 - 您是否也建议更改此设置?
  • @Armino 如果您从 IntelliJ IDEA 终端运行它,这将是一个已知问题:youtrack.jetbrains.com/issue/IDEA-218032。如果在 IntelliJ IDEA 之外运行它,则需要更改 PATH 而不是启动运行时。
【解决方案2】:

通过编辑文件“idea.properties”并设置适当的JVMVersion解决

【讨论】:

  • 您能否更具体一点并从您的idea.properties 中发布一个sn-p?
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 2010-11-30
  • 2021-09-11
  • 2012-02-18
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多