【问题标题】:Specifying minor version in JDK Compliance eclipse在 JDK Compliance eclipse 中指定次要版本
【发布时间】:2023-04-04 22:02:02
【问题描述】:

我的 JDK 版本是 jdk1.8.0_45,我使用 eclipse 中的默认 JDK 合规性设置构建了一个应用程序。

但我的同事有一个版本为 jre1.8.0_20 的 JRE。所以当我的应用程序在他的系统中运行时,它会抛出一个

java.lang.UnsupportedClassVersionError Unsupported major.minor version 52.0

如果我在 JDK 合规性设置为 1.7 的情况下构建应用程序,它显然可以正常工作。但我不想仅仅因为一个小版本不匹配而失去 JDK 8 的所有功能。

在 Eclipse 中,我无法设置 次要版本合规级别。可以设置吗???

或者 Java 是否与次要版本兼容?如果是这样,我相信显然这个错误不应该发生。

【问题讨论】:

  • 这很奇怪。 ` 我已经使用 eclipse 中的默认 JDK 合规性设置构建了一个应用程序` 那是哪个版本?您确定您的同事使用的是 jre8 吗?你检查java -version的输出了吗?
  • @Paizo,我的 JDK 是 1.8.0_45,我同事的版本是 1.8.0_20。我已经指定了问题中的所有信息...

标签: java eclipse


【解决方案1】:

根据this 版本 52.0 是 JDK-8。似乎它是一个根据 JDK 编译到 .class 文件中的数字。 JDK-7 有 51 个,JDK-6 有 50 个等等。

我会声明你同事机器上的执行没有使用 JDK/JRE 8。

尝试在你的同事电脑上运行java -XshowSettings 并检查java.class.version 行的输出 - 如果它是JDK 7,它将显示java.class.version = 51.0

【讨论】:

  • OP 得到 java.lang.UnsupportedClassVersionError(而不是某种 Eclipse 异常)的事实支持了这个答案。
【解决方案2】:

您应该指定运行时“执行环境”版本依赖项而不是特定的 java 版本。

对于插件,在 manifest.mf 中,指定执行环境:JavaSE-1.8

对于普通的 java 项目,在“构建路径...->配置构建路径”中转到“库”,然后选择“添加库”、“JRE 系统库”、“执行环境”并选择 JavaSE-1.8。 删除路径上的任何其他 JRE。

这对 eclipse 说,找到一个 Java >= 1.8 兼容的 JRE。

【讨论】:

  • 您的同事也有可能在他的 Eclipse 中安装和配置了几个 JRE(检查“Window->Preferences->Java->Installed JRE”),其中一些较旧,并且默认他机器上的 JRE 设置实际上是
【解决方案3】:
  1. 下载 JRE 1.8.0_20

  2. 然后将 JRE 1.8.0_20 指定到 Eclipse IDE,如下所示:

  3. 然后重新构建您的应用程序。

(您的问题不是错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8124517

【讨论】:

  • java 错误的良好链接。但是你的回答不能解决问题。如果他的同事真的在使用 JRE 1.8.0_20,它就不会抛出这个异常。根据您的链接:“这个问题似乎是由使用 Java 1.8 jfxrt.jar 运行 Eclipse Java 1.7 引起的。”
【解决方案4】:

Java 以向后兼容而著称,这意味着您在较旧的 jdk 构建的任何应用程序都可以在 较新的 jdk 中运行

jdk1.6jdk1.7 中构建应用程序将在使用 jdk1.8 时运行;可悲的是它不能反过来工作......

次要版本被视为 jdk 的新版本,兼容性问题确实存在。

【讨论】:

  • 您可以尝试使用 -target 编译器标志来告诉它生成将在较旧的(目标)JVM 上运行的代码,而 -source 编译器标志告诉它只接受较旧的 JVM 的语言功能。请注意,这并不总是有效,具体取决于您的代码使用的 Java 语言功能。
  • 我无法提供整个版本信息...如果您查看我的问题,JDK 和 JRE 都是 1.8 版本...唯一的区别是最后一个版本部分。如果我在-source 选项中给出它,它给出了 invalid source release option: 1.8.0_45
【解决方案5】:

没办法。

只需安装 jdk1.8.0_20 并在 Installed JRE's 中选择它。

【讨论】:

    【解决方案6】:

    该错误仅在您进行主要版本更改(例如从 6 到 7 或 7 到 8)时发生。对于次要版本更改不会发生此错误。错误 52 用于在 JRE7 中运行 JDK8 代码。所以仔细检查设置并将 JRE8 设置为运行时环境。

    【讨论】:

      【解决方案7】:

      我和我的同事在使用 x32 和 x64 版本的 JDK 时会遇到这种情况。他使用 Mac,因此只有 x64 可用(用于 Java 8),我使用 M$ 并且有两个版本。我们必须在 64 位版本上开发,否则我们会看到和您一样的错误...

      【讨论】:

      • 这很有趣也很奇怪,因为除非你有本机代码(JNI/JNA 访问或为特定架构编译的机器代码)Java 代码在 32 位和 64 位 JVM 中运行的效果一样好。
      • 是的,我们工作的导师也说不出来。我们不久前遇到了问题(大约 6 个月前)。我们确实使用了第三方库(仅在 x32 模式下可用),但我们不止一次看到此错误消息。 MacOSX 通常是一片混乱,它只允许 x64 Java(捆绑除外)和来自石器时代的库只允许 x32,毕竟我们以某种方式设法运行它,尽管必须发布一个指南如何有人可以启动它:)
      【解决方案8】:

      你可以

      (a) 在您的系统上安装 1.8.0_20 并使用以下代码检查生成的类文件的类版本或

      (b) 在您同事的系统上构建您的应用程序,并使用以下代码检查生成的类版本。

      public void checkClassVersion(File classFile) throws IOException{
      
          DataInputStream in = new DataInputStream(new FileInputStream(file));
      
          int magic = in.readInt();
          if(magic != 0xcafebabe) {
              System.err.println(file.getName() + " is not a valid class!");;
          }
          int minor = in.readUnsignedShort();
          int major = in.readUnsignedShort();
          in.close();
      
          System.out.println(classFile.getName()+" = "+major+"."+minor);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多