【问题标题】:How to compile to target Java 1.0如何编译为目标 Java 1.0
【发布时间】:2019-02-10 20:12:06
【问题描述】:

我想将我的代码编译到 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 二进制文件不起作用,它给我分段错误
  • 使用 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://stackoverflow.com/a/26148408

【问题讨论】:

  • 这可能是 X-Y 问题 (xyproblem.info)。这里真正的问题似乎是您希望与尽可能多的运行环境兼容。关键在于“运行环境”这个短语。您极不可能找到许多(如果有的话)当前已修补和维护但仍在运行 Java 1.0 的系统。
  • @Jason:不过,在这个问题上,我有兴趣为 JDK 1.0 编译。我已经知道以 JDK 1.1 为目标要容易得多,而且如果我为 JDK 1.1 编译,我的程序可能不会支持很少运行的 JDK 1.0 系统。
  • 我有一个 Java 版本 1.0.2,即使在今天搜索安装程序 (JDK-1_0_2-win32-x86.exe) 仍然可以找到下载位置。然而,这是一个仅限 Windows 的安装程序 - 可能出现的其他版本适用于 Solaris 和 MacOS 7.5。没有可用的 Linux 版本

标签: java javac


【解决方案1】:

在 Java 8 中,最低目标是 JDK 1.1。在 Java 9 中,最低目标是增加 JDK 1.6 (Java 6)。

您正在尝试使您的代码与尽可能多的 Java 版本兼容,这是一件好事,但由于 Java 6 自 2015 年以来已停止服务,因此实际上没有人应该尝试编写与 Java 5 或 Java 5 一起运行的新代码年纪大了。

编辑:此外,在 Java 9 中,他们在 Javac 中引入了 --release 标志,这是现在替代 -source-target 的首选选项。基本上--release 6-source 1.6 -target 1.6 是一样的,但它还有一个额外的好处,就是将你的引导类路径与目标版本一起设置,这是一个巨大的便利。实际上,这可以防止您在编译器中设置 --release 6,但会意外使用 Java 7 或更高版本的一些新类或语言功能。

【讨论】:

  • 感谢您的意见!正如您在问题java -version 中看到的那样,我没有使用Java 9。我已准备好安装和使用使javac -target 1.0 工作所需的任何Java 版本。你知道我怎样才能让它工作吗?
  • 我不能接受这个答案,因为它没有回答我的问题:我如何以 JDK 1.0 为目标? (我不是在寻找关于我应该针对哪个 JDK 版本的建议。)
  • 您的直接问题是如何定位 JDK 1.0 ",我的回答确实解决了这个问题。如果您确实需要以 JDK 1.0 为目标,我理解您是否愿意继续寻找答案。我认为您可以使用 maven 编译器工具链,但我自己从未使用过。
  • 我已经澄清了这个问题,因为我确实针对 JDK 1.0(在这个问题中),我正在等待一个可以帮助我这样做的答案。
  • 您可以在 Oracle 存档 (oracle.com/technetwork/java/javase/archive-139210.html) 中将所有 JDK 下载回 1.1。你试过了吗?
【解决方案2】:

TL;DR javac -target 1.1(并且不使用后来添加的任何类或方法)将使其适用于 JDK >=1.0.2(1995-09-16 发布)。回溯更多是不可行的,因为早期的 JDK 不公开可供试用。

javac -target ... 标志值影响 .class 文件中存储的次要(字节偏移 4 和 5)和主要(字节偏移 6 和 7)版本号:

  • JDK 1.8 中的javac -target 1.1 生成版本 45.3,受 JDK 1.0.2(1995-09-16 发布)、JDK 1.1.*(1997-02 发布)、JDK >=1.2(1998-12 发布)支持。 [source]
  • JDK 1.0.2 中的 javac(来自 jdk-1_0_2-win32-x86.exe,在 Linux 上使用 wine 运行)生成版本 45.3。
  • 对于 k ≥ 2,JDK 版本 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 支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多