在1.6下的mac上进行开发时检测非1.5 Java代码

时间:2010-09-21 17:30:41

标签: java eclipse macos java-6 java-5

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

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

8 个答案:

答案 0 :(得分:3)

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

首先,安装1.5 JDK或JRE。然后,转到Eclipse项目的Properties。在Java Build Path下,单击Libraries选项卡,找到标有“JRE System Library”的条目。编辑该条目以指向“备用JRE”(您可能必须单击“已安装的JRE”以告知Eclipse JRE在哪里)。选择你的1.5 JRE。

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

答案 1 :(得分:2)

如果您正在使用Maven,那么这正是animal sniffer的用途。

  

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

     

动物嗅探器可以检查编译代码使用的类和方法签名,并验证您是否仅使用了目标API中可用的类和签名。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这个答案是一个黑客,并且完全没有经过测试,但它应该有用。

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

答案 4 :(得分:0)

唯一真正彻底的事情是安装1.5 JDK并使用它进行编译。如果你不能在OS X上安装旧版本的java,那么安装VirtualBox,在其中安装Linux,并在其上安装java。这听起来像是一个精神上的事情 - 它可能 是一个精神上的事情 - 但它实际上非常简单,并且它给你一个绝对无懈可击的构建。

答案 5 :(得分:0)

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

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

进行构建

答案 6 :(得分: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

答案 7 :(得分:0)

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

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

  1. 仅在我要检查的命名空间中保留类,构造函数,方法和成员属性。就我而言,java.*javax.*
  2. 排除显示在“白名单”中的所有类,构造函数,方法和成员属性,列出给定JDK版本的所有有效符号(例如1.5)
  3. 如果生成的报告在过滤后包含任何类,构造函数,方法或成员属性(即,如果这不是空的),则构建将中止 - 这意味着您正在使用目标不支持的API JDK发布。

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