如果我们看到。类文件结构,它说:偏移量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?
在编译过程中,您不能自己指定次要数字。
主数字和次数字并不表示用于编译的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+版本。如何在内部配置?