【问题标题】:Java Cross-Compilation - Benefits of Latest JDKJava 交叉编译 - 最新 JDK 的好处
【发布时间】:2014-02-12 15:32:42
【问题描述】:

我维护一个 Java 应用程序,我在分发它之前一直使用 JDK 1.6 编译它,因为这是我的应用程序所需的最低版本 - 我不使用任何更新的功能。我看不出在更高版本中编译它的意义,否则旧的 JRE 将无法运行它(即 Mac OSX 上使用 Java 1.6 的用户)。

现在,鉴于最近有关 Java 的新闻报道以及 JDK 更高版本中的错误修复,最好使用可用的最新 JDK 交叉编译它,使用以下语法:

javac -Xlint -source 1.6 -target 1.6 -bootclasspath jre6/lib/rt.jar MyClass.java

这会生成一个在 JRE 1.6 下运行良好的 Class 文件,但是首先使用 JDK 1.6 有什么好处吗?我是在利用较新的 JDK 中的任何优化,还是在生成相同的字节码?

【问题讨论】:

  • 例如,字符串连接的字节码改变了几次
  • 好的,字节码可能会发生变化,但我主要关心的是安全性和性能 - 使用更新的 JDK 但针对 1.6 有什么好处?
  • AFAIK,如果您在 JDK 1.6 上不带标志进行编译,则相当于说 -source 1.6 和 -target 1.6。

标签: java jdk1.6


【解决方案1】:

您应该考虑以下几点:

  1. 字符串连接的字节码多次更改。不再是性能不佳的陷阱。但我不确定这是来自重构字节码表示还是来自更改 VM。
  2. 旧的(系统)JDK/JRE 可能会在开发机器上带来安全风险。如果开发人员使用过时的 JDK/JRE,他可能容易受到他正在执行的恶意软件的攻击。
  3. 客户端过时的 Java 版本会使用户面临安全风险。如果您允许您的用户使用旧的 Java 版本,他们会这样做。这可能存在安全风险。
  4. Java 6 is no longer publicy supported. 安全问题是用户既没有被告知他的java版本应该被更新,也没有被强制更新。请记住,Java 位于安全漏洞的前三名。
  5. 您可以在为 1.6 目标编译时使用 Java 1.7 功能。 使用 -source 1.7-target 1.6 您可以使用像 int i = 0b011 这样的语言功能
  6. JDK 附带的工具已更新。 可能会有用于开发 Java 应用程序的新工具,例如在某个时候,java VisualVM 被添加到了 JDK。

查看该列表,我认为使用当前 JDK 的优点胜过使用旧版本的优点。

编辑: 我进行了一些调查,现在我建议您安装适合您目标版本的 JDK。由于 bootstrap/ext 类路径,在交叉编译时无论如何都需要 JDK。请参阅How to cross-compile for older platform versions 了解更多信息。该站点还指出不同 JDK 之间的编译存在差异(倒数第二段),并建议使用与您的目标版本相关的 JDK(最后一段)。同样相关的可能是javac documentation

【讨论】:

  • 我同意你提出的所有观点,但是尽管 Apple 等公司继续将 JRE 1.6 作为 Mac OS 的标准,而企业将 JRE 1.6 作为标准构建的一部分,但我没有选择是否希望我的应用程序使用这些设置。如果我们忽略 JRE,我是否会通过使用 JDK 8(具有 1.6 目标并引用 1.6 引导类路径)编译我的代码来获得一些安全优势和优化(注意字符串连接更改),还是与使用 JDK 几乎相同1.6 来编译我的代码?
  • 使用-source 1.7-target 1.6,编译过程出错。而如果使用-source 1.6int i = 0b011就不行了。
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多