我打算用java编写私人使用的命令行工具,以便在我的私人系统(jdk 7)和大学的数字处理服务器(jre 1.4)上使用。尝试从源代码安装OpenJdk失败了,因为它缺少几个依赖项,这在计算服务器上根本没有意义——例如CUPS。安装这些依赖项和他们的依赖项所需要的工作可能会破坏自动化任务的全部意义,即使生活更容易。
习惯了泛型的便利,我不想写1.4的源代码。我发现,在从命令行编译时,像
这样的选项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
添加到上面的命令中)。我找不到旧的jdk(特别是classes.zip),除了oracle.com,在那里需要注册才能下载那些带有注册掩码的东西,这很清楚地表明这些不是私人使用的。
到目前为止,我找到的所有相关答案都没有提示如何在netbeans中进行这种字节码/源代码分离的交叉编译,也没有解决查找旧jdk的问题。
Eclipse不是一个真正的选择,因为我不知道如何像在netbeans中那样自动生成jar。
任何想法?
平台细节:
本地(来自Netbeans "Help→About"):
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)
Update:只是为了确保—可以用新语法编译源代码到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上迭代时,编译器生成标准的基于迭代器的习惯用法。当迭代非集合可迭代对象时,编译器会产生一个错误。
我想这意味着,如果我想使用任何合理的现代功能,我将别无选择,只能尝试在服务器上安装一个较新的JRE…
[1]如何编译支持旧版本java的.java ?
[2] http://twit88.com/blog/2008/08/26/java-understanding-jsr14/
jdk不兼容。也就是说,不能为旧JDK版本编译新特性。(或JRE)。语言结构,如泛型,如果我没有完全搞错的话,是Java中字节码或解释器的一部分。
恐怕你只有两个选择。1)安装新的JDK或2)编写1.4源代码