当前位置: 首页 > 知识库问答 >
问题:

如何使用eclipse在JDK的特定次要版本上构建java文件?

凌波峻
2023-03-14

如果我们看到。类文件结构,它说:偏移量0x04-0x05用于JDK的次要版本,偏移量0x06-0x07用于JDK的主要版本

我使用eclipse和JDK1进行java项目开发。为JRE系统库和类文件配置的5.0_7/JRE将偏移显示为0x00 0x00 0x00 0x31。

如何将编译器更改为JDK1。5.0_7以使偏移量变为0x00 0x07 0x00 0x31?

共有1个答案

张成济
2023-03-14

在编译过程中,您不能自己指定次要数字。

主数字和次数字并不表示用于编译的JDK版本。它们表示类文件格式的版本。看看这个答案。

类文件版本还指定能够执行该类文件的JRE版本。例如:如果major.minor版本是0x30.0x00,您至少需要一个JRE 1.4来执行这个类文件。这并不意味着以前的JRE不能理解字节码。一旦你使用了以前Java版本中不存在的Java语言特性/运行时类,这就不再是真的了。

一个简单的例子

public class Scratch {
    public static void main(String[] args) {
        System.out.println("foobar");
    }
}

这个简单的类可以使用不同于JDK的默认类文件版本编译

下面将为1.4版编译它

javac -source 1.4 -target 1.4 Scratch

在这个简单的示例中,生成的字节码仍然是相同的。对于这个简单的示例,类文件的最低版本可能是2D。E(使用javac-target1.1-source1.2scratch.java编译它)。然后JRE 1.1(通过JRE 1.1.8验证)可以运行它。

要检查版本,可以使用此代码段

import java.io.DataInputStream;
import java.io.FileInputStream;
public class ClassFileVersion {
    // add exception handling, left out only for the example
    public static void main(String[] args) throws Exception {
        String filename = args[0];
        try (DataInputStream in = new DataInputStream(new FileInputStream(filename))) {
            int magic = in.readInt();
            if (magic != 0xcafebabe) {
                System.out.println(filename + " looks not like a Java class file.");
            }
            int minor = in.readUnsignedShort();
            int major = in.readUnsignedShort();
            System.out.printf("majaor.minor: %X.%X hex  %d.%d dec%n", major, minor, major, minor);
        }
    }
}

在这里编辑一个小片段来演示其影响。

>

  • 编译上面的Scratch。java与当前的JDK
  • 运行类文件次要版本的Scratch。类别

    Path path = Paths.get("Scratch.class");
    byte[] bytes = Files.readAllBytes(path);
    bytes[5] = 1; // it was zero before
    Files.write(path, bytes, StandardOpenOption.TRUNCATE_EXISTING)

    运行更改的类文件java Scratch执行将失败(错误消息的措辞可能不同,具体取决于您使用的JRE)

    java.lang.UnsupportedClassVersionError: Scratch has been compiled by a more recent
    version of the Java Runtime (class file version 52.1), this version of the Java Runtime
    only recognizes class file versions up to 52.0

    如果您为较低的主要版本(-Target选项)编译源代码,则以前的JRE可以执行字节码(请参阅前面提到的限制)。

    假设您使用JDK 8javac-target 1.4-source 1.4 Scratch来运行它。java。通过javac可以发生不同的事情。首先,它检查是否有划痕。java仅使用java 1.4中提供的语言功能。第二个结果是划痕。上课主修。Java 1.4(30.0十六进制)中使用的次要类文件版本。然后您可以使用JRE 1.4作为JavaScratch运行这个类。

  •  类似资料:
    • 问题内容: 我不知道该如何工作。 场景: 我有一个用gradle构建的应用程序 该应用程序使用JavaFX 我想要的是 使用一个变量(针对每个开发人员的机器定义),该变量指向JDK的安装,该安装将用于构建整个应用程序/测试/ … 我考虑过要文件,定义变量。就像是 我不想要的 指向JAVA_HOME所需的JDK 我可以接受很多建议: 定义系统环境变量的解决方案,我可以在脚本中检查 中定义的变量 仅针

    • 问题内容: 我到处都看到JRE,但是我不确定哪个JDK正在编译我的代码。我如何找到? 问题答案: 实际上,Eclipse有其自己的编译器。您可以仅使用JRE和Eclipse开发Java应用程序

    • 问题内容: 之前也曾提出过类似的问题,但由于配置脚本的标志已更改,因此答案似乎不再适用。我正在尝试从x86和x64上的Ubuntu 14.04.5上的git源编译OpenVPN。我已经构建了OpenSSL 1.0.1t并将其安装到/ usr / local / ssl。我尝试过配置选项的各种组合,并且编译器似乎可以识别 完成,没有错误,但结果为。完成安装后,它仍会报告OpenSSL的系统版本: 系

    • 我在带有java 1.6的服务器上有一个与tomcat一起运行的war文件。我需要更新服务器上的java版本并让war文件使用java 1.7。当我重新启动tomcat时,这会自动发生吗,还是需要重新编译war文件? 我试图在我们的生产环境(1.7)中重现一个在我们的QA环境(1.6)中没有发生的错误。如果有兴趣,这里有个问题。

    • 场景: 我有一个使用Gradle构建的应用程序 应用程序使用JavaFX 我想要的 null 将指向所需的JDK 我可以接受很多建议: 定义系统环境变量的解决方案,我可以在build.gradle脚本中签入该变量 在gradle.properties中定义的变量 仅针对构建上下文重写JAVA_HOME变量(类似于) 我没有想过的其他事情 问题: 如何将变量(如何定义,如中的变量、系统环境变量、..

    • Android新构建系统需要Gradle 1.10+版本。如何在内部配置?