我想将代码编译为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
可行的原因是此答案:https://stackoverflow.com/a/26148408
答案 0 :(得分:6)
在Java 8中,最小目标是JDK 1.1。在Java 9中,最低目标是增加了JDK 1.6(Java 6)。
您正试图使代码与尽可能多的Java版本兼容,这是一件好事,但是由于Java 6自2015年以来已经停用,因此实际上没有人应该尝试编写可与Java 5或Java一起运行的新代码。较老。
编辑:同样,他们在Java 9中在Javac中引入了--release
标志,这是现在而不是-source
和-target
的首选选项。基本上--release 6
与-source 1.6 -target 1.6
是一样的东西,但是它还具有将bootclasspath设置为与目标发行版一起使用的额外好处,这非常方便。实际上,这可以防止您在编译器中设置--release 6
,但会意外地使用Java 7或更高版本的某些新类或语言功能。
答案 1 :(得分:1)
TL; DR javac -target 1.1
(并且不使用以后添加的任何类或方法)将使其在JDK> = 1.0.2(1995年9月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
,在Linux上以wine
运行)生成版本45.3。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的支持。