【发布时间】:2013-03-03 16:38:31
【问题描述】:
我打算用 java 编写私有命令行工具,用于我的私有系统 (jdk 7) 和我的大学数字处理服务器 (jre 1.4)。尝试从源安装 OpenJdk 失败,因为它缺少几个依赖项,这在计算服务器上根本没有意义——例如杯子。安装此类依赖项及其依赖项所需的工作可能会破坏自动化任务的全部意义,即让生活更轻松。
虽然习惯了泛型的便利,但我不想编写 1.4 SOURCE 代码。我发现,从命令行编译时,像
这样的选项javac -target 1.4 -bootclasspath jdk1.4.2/lib/classes.zip \
-extdirs "" OldCode.java
可用(参见 [1]),只要我不使用较新的库功能(-bootclasspath 用于),它应该允许将 jdk5 甚至 jdk7 特定语法编译为 jdk1.4 兼容字节码。
这带来了两个问题:
虽然我可以在 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]How do i compile a .java with support for older versions of java?
[2]http://twit88.com/blog/2008/08/26/java-understanding-jsr14/
【问题讨论】:
标签: java generics netbeans-7 cross-compiling