我打算用java编写私有命令行工具,用于我的私有系统(jdk 7)和我的大学数字处理服务器(jre 1.4)。尝试从源安装 OpenJdk 失败,因为它缺少几个依赖项,这在计算服务器上根本没有意义——例如 CUPS。安装此类依赖项及其依赖项所需的工作可能会破坏自动化任务的全部意义,即让生活更轻松。
虽然习惯了泛型的便利,但我不想编写 1.4 SOURCE 代码。我发现,从命令行编译时,选项如
javac -target 1.4 -bootclasspath jdk1.4.2/lib/classes.zip \
-extdirs "" OldCode.java
是可用的(参见 [1]),它应该允许将 jdk5 甚至 jdk7 特定的语法编译为 jdk1.4 兼容的字节码,只要我不使用更新的库功能(-bootclasspath 用于)。
这带来了两个问题:
虽然我可以在 Netbeans 7.3 中轻松地将每个项目的合规级别设置为给定的 java 版本,但它也迫使我使用 1.4 语法(可能通过添加
-source 1.4
到上面的命令)。除了 oracle.com 之外,我在任何地方都找不到旧的 jdk(特别是 classes.zip),其中仅需要注册才能下载带有注册掩码的那些,非常清楚这些不是供私人使用的。
到目前为止,我发现的所有相关答案都没有提示如何在 netbeans 中进行这种字节码/源代码分隔的交叉编译,也没有解决查找旧 JDK 的问题。
Eclipse 并不是一个真正的选择,因为我不知道如何像在 netbeans 中那样自动生成 JAR。
有任何想法吗?
平台详情:
本地(来自 Netbeans“帮助 → 关于”):
Product Version: NetBeans IDE 7.3 (Build 201302132200) Java: 1.7.0_11; Java HotSpot(TM) 64-Bit Server VM 23.6-b04 Runtime: Java(TM) SE Runtime Environment 1.7.0_11-b21 System: Windows 7 version 6.1 running on amd64; Cp1252; de_DE (nb)
偏僻的:
java version "1.4.2_11" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_11-b06) Java HotSpot(TM) 64-Bit Server VM (build 1.4.2_11-b06, mixed mode)
更新:为了确定——可以用新语法将源代码编译到 Java 1.4。例如我写了这个文件:
class Target<T>{
public T field;
public static void main(String[] args){
System.out.println("Hello World!");
Target<String> target = new Target<>();
target.field = "More Worlds.";
System.out.println(target.field);
}
}
然后我用JDK 7编译它
javac -target jsr14 Target.java
并将其上传到只有 JRE 1.4(根本没有 JDK)存在的计算服务器。它给出了预期的输出
Hello World!
More Worlds.
显然,“jsr”目标是一个未记录的特性,参见例如 [2]。该链接还提到,这有点像 hack,因为只会处理 Collections 库的 for-each 循环:
for-each 循环:在对数组进行迭代时,编译器会生成一个归纳变量和标准的数组迭代习语。在对 Collection 进行迭代时,编译器会生成标准的基于迭代器的惯用语。当迭代一个非Collection Iterable 时,编译器会产生一个错误。
我想这意味着,如果我想使用任何合理的现代功能,我别无选择,只能尝试将更新的 JRE 安装到服务器上......
[1]如何编译支持旧版本 java 的 .java?
[2] http://twit88.com/blog/2008/08/26/java-understanding-jsr14/