我维护一个 Java 应用程序,在分发它之前我总是使用 JDK 1.6 进行编译,因为这是我的应用程序所需的最低版本 - 我不使用任何更新的功能。我不认为在更高版本中编译它有什么意义,否则旧的 JRE 将无法运行它(即使用 Java 1.6 的 Mac OSX 上的用户)。
现在,随着最近关于 Java 的安全新闻报道以及 JDK 更高版本中的错误修复,最好使用以下语法使用最新的 JDK 进行交叉编译:
javac -Xlint -source 1.6 -target 1.6 -bootclasspath jre6/lib/rt.jar MyClass.java
这会生成一个在 JRE 1.6 下运行良好的类文件,但是与首先使用 JDK 1.6 相比有什么好处吗?我是否利用了较新 JDK 中的任何优化,或者是否生成了相同的字节码?
您应该考虑以下几点:
-
字符串连接的字节码发生了多次变化。它不再是性能不佳的陷阱。但我不确定这是否来自字节码表示的重构或来自更改虚拟机。
-
旧的(系统)JDK/JRE 可能会在开发计算机上带来安全风险。如果开发人员使用过时的 JDK/JRE,他可能容易受到正在执行的恶意软件的攻击。
-
客户端过时的 java 版本会让用户面临安全风险。如果您允许用户使用旧的 Java 版本,他们就会这么做。这可能存在安全风险。
-
Java 6 不再受到公开支持。安全问题在于,用户既没有被告知他的java版本应该更新,也没有被强迫这样做。请记住,Java 位于安全漏洞的前三名之列。
You can use Java 1.7 features while compiling for 1.6 target. Using -source 1.7
and -target 1.6
you can use language features like int i = 0b011
-
JDK 附带的工具已更新。也许有用于开发 java 应用程序的新工具,例如在某个时刻javaVisualVM已添加到 JDK 中。
看看这个列表,我认为使用当前 JDK 的优点胜过使用旧 JDK 的优点。
EDIT:
我进行了一些调查,现在我建议您安装适合您的目标版本的 JDK。由于 bootstrap/ext 类路径,您在交叉编译时无论如何都需要 JDK。看如何针对旧平台版本进行交叉编译了解更多信息。该站点还指出不同 JDK 之间的编译存在差异(倒数第二段),并建议使用与您的目标版本相关的 JDK(最后一段)。同样相关的可能是javac 文档.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)