4

我使用 mac(因此使用 java 1.6)来开发一个跨平台的应用程序,该应用程序在 Java 1.5 中发布。我发现 Eclipse 可以强制执行 1.5 合规性,这使我免于使用 1.6 样式的 @Override 语法发布一些代码。但是,eclipse 的合规性检测仅限于语法。它不会捕获函数。例如,我使用了 1.6 String.isEmpty() 方法,该方法在 Eclipse 和我的 mac 命令行中构建和运行时没有任何警告,但在转移到我们的 1.5 linux 机器时就崩溃了。

有没有办法,也许我可以在构建之后在 jar 文件上运行,或者以任何其他方式,在不离开我的 mac 的情况下捕捉我滑入的 1.6-isms?

4

8 回答 8

3

好问题。我的建议是在 Eclipse 中正确配置项目的构建路径以指向 1.5 库。

首先,安装 1.5 JDK 或 JRE。然后,转到 Eclipse 项目的属性。在 Java Build Path 下,单击 Libraries 选项卡,找到标有“JRE System Library”的条目。编辑该条目以指向“Alternate JRE”(您可能必须单击“Installed JREs”来告诉 Eclipse JRE 的第一个位置)。选择您的 1.5 JRE。

这应该使用只有 1.5 API 的 Java 5 rt.jar。

于 2010-09-21T17:49:40.897 回答
2

如果您使用的是 Maven,那么这正是动物嗅探器的用途。

如果您正在开发一个必须支持在 JDK 1.4 版上运行的项目,但您的开发系统没有可用的 JDK 1.4 版,则很容易意外使用仅在较新版本的 JDK 中可用的方法或类. 例如,如果您在较新的Macintosh上为 Maven 2.0.x 开发插件。

Animal sniffer 可以检查您的编译代码使用的类和方法签名,并验证您是否只使用了您所针对的 API 中可用的类和签名。

于 2010-09-21T17:42:10.710 回答
1

是什么阻止您在 Mac Box 上使用 1.5 java 版本。我有 mac 机器,它有 java 1.5 和 1.6 版本。如果您无法找到它的位置,它位于:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home

于 2010-09-21T17:44:21.893 回答
0

唯一真正彻底的事情是安装 1.5 JDK 并使用它进行编译。如果您无法在 OS X 上安装旧版本的 java,则安装 VirtualBox,在其中安装 Linux,然后在其上安装 java。这听起来像是一种精神上的事情——它可能一种精神上的事情——但它实际上非常简单,它给你一个绝对防水的构建。

于 2010-09-21T17:42:58.710 回答
0

如果您通过 javac 正常编译,则有一个命令行选项 -source release Java Oracle doc指定接受的源代码版本。

因此,仅使用 1.5 构建使用 -source 5 或 -source 1.5

于 2010-09-21T17:44:24.567 回答
0

这个答案是一个hack,并且完全未经测试,但它应该可以工作。

当 Eclipse 编译您的代码时,它使用rt.jartools.jar属于当前和/或指定的 JRE。您可以将“普通”JDK 复制到一个新目录中,并替换 Linux/Windows 1.5 发行版中的 JARfiles。将该 JRE 添加到 Eclipse(在 Preferences 中)作为备用,并在您想要验证代码时切换到它。

于 2010-09-21T17:36:05.143 回答
0

假设您从 10.5 升级到 OSX 10.6,您应该将 JDK v1.5 与 JDK 1.6 一起安装,否则您可以从Apple下载它。

然后,您可以使用ant和 JDK 1.5 构建应用程序。请注意,ant依赖于您为 JAVA_HOME 环境变量设置的值。

例如,您可以编辑/Users/name/.bash_profile以根据安装 JDK 的实际路径包含这些值:

JAVA_HOME_14=/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Home
JAVA_HOME_15=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home
JAVA_HOME_16=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home

export JAVA_HOME=$JAVA_HOME_15
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

因此,当您需要切换到 JDK 1.6 时,只需交换

export JAVA_HOME=$JAVA_HOME_15

和:

export JAVA_HOME=$JAVA_HOME_16
于 2010-09-21T17:59:24.123 回答
0

为此,我使用DependencyFinder 。这首先分析我的 jar 文件中所有类的字节码并提取所有依赖项。结果,生成了一个 XML 报告,其中包含我的应用程序引用的所有类、构造函数、方法和成员属性。

然后分两步过滤此 XML 报告:

  1. 在我要检查的命名空间中只保留类、构造函数、方法和成员属性。在我的情况下,java.*javax.*
  2. 排除确实出现在“白名单”中的所有类、构造函数、方法和成员属性,该“白名单”列出了给定 JDK 版本(例如 1.5)的所有有效符号

如果过滤后生成的报告包含任何类、构造函数、方法或成员属性(即,如果它不为空),则构建将中止——这意味着您正在使用目标 JDK 版本不支持的 API。

听起来有点冗长,但在实践中效果很好,并且不依赖于您的 IDE 设置(当多个开发人员在同一个项目上工作时这是不切实际的)。我有一个 ant 宏可以自动执行此任务,尽管此解决方案实际上并不需要 ant。

于 2010-09-21T18:32:22.320 回答