我想将我的代码编译为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
。javac: invalid target release: 1.0
。javac: invalid target release: 1.0
。javac: invalid target release: 1.0
。这是第一个使用Linux amd64二进制文件的JDK。javac: invalid target release: 1.0
。javac: invalid target release: 1.0
。javac: invalid target release: 1.0
。 (当我问这个问题时,我首先得到了这个错误。)我认为-target 1.0
可能有效的原因是这个答案:https://stackoverflow.com/a/26148408
在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
是一回事,但它还具有将bootclasspath与目标版本一起设置的额外好处,这是一个巨大的便利。在实践中,这可以防止您在编译器中设置--release 6
,但意外地使用Java 7或更高版本中的某些新类或语言功能。
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
生成版本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-win32-x86.exe
生成版本46.0,由JDK> = 1.2支持。wine
生成版本47.0,由JDK> = 1.3支持。