How to compile to target Java 1.0

僤鯓⒐⒋嵵緔 提交于 2019-12-21 02:33:52

问题


I want to compile my code down to Java version 1.0.

I managed to compile down to 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)

But the target option does not seem to accept 1.0:

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

How do I target JDK 1.0?

I want my .class and .jar file to work as many systems as possible, including very old ones, including JDK 1.0. (I don't have access to a system running JDK 1.0.)

What I've tried so far:

  • Compiling with ecj-3.0.2.jar: It doesn't support -target 1.0, the minimum is -target 1.1.
  • Compiling with JDK 1.0: I couldn't run it, it wasn't released for Linux.
  • Compiling with JDK 1.1: I couldn't run it, it wasn't released for Linux.
  • Compiling with JDK 1.2: The Linux i386 javac binary doesn't work, it's giving me Segmentation fault.
  • Compiling with JDK 1.3: javac: invalid target release: 1.0.
  • Compiling with JDK 1.4: javac: invalid target release: 1.0.
  • Compiling with JDK 1.5: javac: invalid target release: 1.0. This is the first JDK with Linux amd64 binaries.
  • Compiling with JDK 1.6: javac: invalid target release: 1.0.
  • Compiling with JDK 1.7: javac: invalid target release: 1.0.
  • Compiling with JDK 1.8: javac: invalid target release: 1.0. (I got this error first, when I asked the question.)

The reason why I believe that -target 1.0 may work is this answer: https://stackoverflow.com/a/26148408


回答1:


In Java 8 the minimum target is JDK 1.1. In Java 9 the minimum target was increased JDK 1.6 (Java 6).

Its a good thing you are trying to make your code compatible with as many java versions as possible, but since Java 6 has been out of service since 2015, really nobody should be trying to write new code that runs with Java 5 or older.

EDIT: Also, in Java 9 they introduced the --release flag in Javac, which is the preferred option instead of -source and -target now. Basically --release 6 is the same thing as -source 1.6 -target 1.6, but it also has the added benefit of setting your bootclasspath in conjunction with the target release, which is a huge convenience. In practice this protects you from setting --release 6 in the compiler, but accidentally using some new class or language feature from Java 7 or higher.




回答2:


TL;DR javac -target 1.1 (and not using any classes or methods that were added later) will make it work on JDK >=1.0.2 (released on 1995-09-16). It's not feasible to go back more, because earlier JDKs are not publicly available to try.

The javac -target ... flag value affects the minor (byte offset 4 and and 5) and major (byte offset 6 and 7) version number stored in the .class file:

  • javac -target 1.1 in JDK 1.8 generates version 45.3, supported by JDK 1.0.2 (released on 1995-09-16), JDK 1.1.* (released in 1997-02), JDK >=1.2 (released in 1998-12). [source]
  • javac in JDK 1.0.2 (from jdk-1_0_2-win32-x86.exe, run with wine on Linux) generates version 45.3.
  • For k ≥ 2, JDK release 1.k supports class file format versions in the range 45.0 through (44+k).0 inclusive. [source]
  • javac -target 1.2 generates version 46.0, supported by JDK >=1.2.
  • javac -target 1.3 generates version 47.0, supported by JDK >=1.3.
  • javac -target 1.4 generates version 48.0, supported by JDK >=1.4.
  • etc.


来源:https://stackoverflow.com/questions/54620554/how-to-compile-to-target-java-1-0

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!