如何编译为Java 1.0版本的目标代码

6
我想将我的代码编译为Java版本1.0。
我已经成功将代码编译到1.1
$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
$ javac -target 1.2 -source 1.2 MyClass.java
(works with some warnings)
$ javac -target 1.1 -source 1.2 MyClass.java
(works with some warnings)

但是 target 选项似乎不能接受 1.0

$ javac -target 1.0 -source 1.2 MyClass.java
javac: invalid target release: 1.0

如何针对JDK 1.0进行编译?

我希望我的.class.jar文件能够在尽可能多的系统上运行,包括非常老的系统,例如JDK 1.0。(我无法访问运行JDK 1.0的系统。)

到目前为止,我尝试过:

  • 使用ecj-3.0.2.jar编译:它不支持-target 1.0,最低版本是-target 1.1
  • 使用JDK 1.0编译:我无法运行它,因为它没有发布Linux版本。
  • 使用JDK 1.1编译:我无法运行它,因为它没有发布Linux版本。
  • 使用JDK 1.2编译:Linux i386 javac二进制文件无法工作,会出现Segmentation fault
  • 使用JDK 1.3编译:javac: invalid target release: 1.0
  • 使用JDK 1.4编译:javac: invalid target release: 1.0
  • 使用JDK 1.5编译:javac: invalid target release: 1.0。这是第一个具有Linux amd64二进制文件的JDK。
  • 使用JDK 1.6编译:javac: invalid target release: 1.0
  • 使用JDK 1.7编译:javac: invalid target release: 1.0
  • 使用JDK 1.8编译:javac: invalid target release: 1.0。(我在提问时首先遇到了这个错误。)

我相信-target 1.0可能有效的原因是这个答案:https://dev59.com/aIPba4cB1Zd3GeqPyuZ2#26148408


2
这可能是一个 X-Y 问题的情况(http://xyproblem.info/)。看起来真正的问题在于您希望与尽可能多的运行环境兼容。关键在于“运行环境”这个词组。您极有可能找不到许多(如果有的话)仍在运行 Java 1.0 的当前已修补和维护的系统。 - Jason
@Jason:尽管如此,在这个问题上我对编译JDK 1.0很感兴趣。我已经知道针对JDK 1.1更容易,如果我为JDK 1.1编译,我的程序可能支持几乎所有运行JDK 1.0的系统。 - pts
1
我有一个Java版本1.0.2,并且即使在今天,仍然可以找到安装程序(JDK-1_0_2-win32-x86.exe)的下载位置。然而,这只是一个适用于Windows的安装程序 - 可能会出现其他适用于Solaris和MacOS 7.5的版本。从未提供过Linux版本。 - Thomas Kläger
2个回答

6
在Java 8中,最低目标是JDK 1.1。在Java 9中,最低目标增加到了JDK 1.6(Java 6)。
尽管尝试使代码与尽可能多的Java版本兼容是一件好事,但由于Java 6自2015年以来已停止服务,真正没有人应该尝试编写能够运行在Java 5或更早版本上的新代码。
另外,在Java 9中引入了Javac的--release标志,这是优选选项,而不是-source和-target。基本上,--release 6与-source 1.6 -target 1.6相同,但它还具有设置引导类路径与目标发布配合使用的额外好处,这是一个巨大的方便。实际上,这保护您免受在编译器中设置--release 6,但意外使用Java 7或更高版本的某些新类或语言功能的影响。

1
谢谢您的意见!正如您在问题“java -version”中所看到的,我没有使用Java 9。我已经准备好安装和使用任何必要的Java版本来使“javac -target 1.0”工作。您知道我该如何让它工作吗? - pts
2
我不能接受这个答案,因为它没有回答我的问题:如何针对JDK 1.0进行目标设置?(我不是在寻求有关应该针对哪个JDK版本的建议。) - pts
1
你的直接问题是如何针对JDK 1.0,但从这个要求中退一步,你的目标似乎更像是“我希望我的.class和.jar文件能在尽可能多的系统上工作”,而我的答案确实解决了这个问题。如果你确实需要针对JDK 1.0,我理解如果你愿意继续寻找答案。我认为你可以使用Maven编译器工具链,但我自己从未使用过。 - Andy Guibert
1
我已经澄清了问题,现在我确实是针对JDK 1.0(在这个问题中),我正在等待一个能帮助我做到这一点的答案。 - pts
2
你可以在Oracle档案库(https://www.oracle.com/technetwork/java/javase/archive-139210.html)中下载所有JDK版本,包括1.1版。你已经试过了吗? - dunni
显示剩余8条评论

2
TL;DR 使用javac -target 1.1(不使用任何后来添加的类或方法)可以让它在JDK >=1.0.2(1995-09-16发布)上工作。无法回退更多,因为较早的JDK不公开可用于尝试。 javac -target ...标志值会影响存储在.class文件中的次要(字节偏移量4和5)和主要(字节偏移量6和7)版本号:
  • javac -target 1.1 在JDK 1.8中生成版本45.3,由JDK 1.0.2(1995-09-16发布),JDK 1.1.*(1997-02发布),JDK >=1.2(1998-12发布)支持。[source]
  • javac 在JDK 1.0.2(来自jdk-1_0_2-win32-x86.exe,在Linux上运行wine)生成版本45.3。
  • 对于k ≥ 2,JDK release 1.k支持范围在45.0到(44+k).0之间的类文件格式版本。[source]
  • javac -target 1.2 生成版本46.0,由JDK >=1.2支持。
  • javac -target 1.3 生成版本47.0,由JDK >=1.3支持。
  • javac -target 1.4 生成版本48.0,由JDK >=1.4支持。
  • 等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接