我打算在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
)。
除了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]。该链接还提到,它有点像黑客,因为只有for-Collections库的每个循环都将被处理:
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/
答案 0 :(得分:1)
JDK不是向前兼容的。也就是说,您无法为旧的JDK版本编译新功能。 (或JRE)。 语法结构,例如泛型,如果我没有完全弄错,那就是Java中字节码或解释器的一部分。
AFAIK你只有两个选择。 1)安装新的JDK或2)编写1.4源代码。