如何在Mac OS X上获取JDK 1.5

23

我需要为一个仍在运行JDK 1.5的遗留应用程序编写一些代码。不幸的是,看起来OS X并没有实际安装1.5 JDK;它只链接到1.6:

/System/Library/Frameworks/JavaVM.framework/Versions $ ls -l
lrwxr-xr-x  1 root  wheel    5 Apr 26 11:53 1.3 -> 1.3.1
drwxr-xr-x  3 root  wheel  102 Feb 11 15:33 1.3.1
lrwxr-xr-x  1 root  wheel   10 Apr 26 11:53 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Apr 26 11:53 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Apr 26 11:53 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 Apr 26 11:53 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel    5 Apr 26 11:53 1.6 -> 1.6.0
drwxr-xr-x  7 root  wheel  238 Apr 26 11:53 1.6.0
drwxr-xr-x  8 root  wheel  272 Apr 26 11:53 A
lrwxr-xr-x  1 root  wheel    1 Apr 26 11:53 Current -> A
lrwxr-xr-x  1 root  wheel    3 Apr 26 11:53 CurrentJDK -> 1.6

http://developer.apple.com/java/faq/上看,Java是操作系统更新的一部分。我使用的是Mac OS X v10.6.3(Snow Leopard)。有没有办法在这个操作系统版本上安装1.5 JDK?

还是我需要尝试找到旧版本的OS X才能完成这项工作?

8个回答

13
请参考该链接,了解如何在Snow Leopard上获取和安装JDK 1.4和1.5。此外,请记住,每当运行软件更新并安装JDK更新时,您都需要“修复”1.4和1.5 JDK的符号链接。 更新:作为附注,对于在OS X上开发多个JDK的人,请看一下这个方便的小工具,可以通过命令行切换JDK:setjdk

8
这里实际上有两个问题:
1. 安装旧版本的Java,并且防止软件更新删除它。 2. 让需要使用旧版本的应用程序知道在哪里找到它,同时让其他所有应用程序都受益于最新版本。
关于安装旧版本的Java,我没有任何补充(但),然而,据苹果公司Java Runtime Engineer Mike Swingler在这篇文章中所说:
“除了苹果公司的软件更新(我们很不情愿这样做,因为这总会破坏某些人),没有人可以或应该更改/System/Library/Frameworks/JavaVM.framework中的符号链接。”
换句话说,更新操作系统对旧版Java的链接是一个值得怀疑的做法,因为它强制系统上的每个Java应用程序都使用旧版Java。
正确的方法是根据需要将JAVA_HOME设置为正确的Java版本。您可以通过执行/usr/libexec/java_home来获取特定版本的路径。例如,要获取1.5版本的路径:/usr/libexec/java_home --version 1.5

5
您不需要Java 1.5的副本来进行开发;Java 1.6向后兼容Java 1.5,因此在1.5上运行的任何内容都可以在1.6上运行。为了确保所有内容都适用于1.5,-source-target标志可能会有所帮助。话虽如此,this article将解释如何在Snow Leopard上获取Java 1.5的副本。但是请注意,这可能会潜在地破坏/损害您的系统。

JRE是向后兼容的。但是JDK不是这样的;如果您使用的jdk中有任何类实现了新接口,则会出现错误,表示您需要实现这些新方法。 - oligofren
对,但是一个方法从 JDK 的一个版本到另一个版本中被移除或重命名的频率有多高?通常只会添加方法。弃用通常需要几个 JDK 版本才能完全移除。 - Michael Aaron Safyan
嗯,没错 :) 我从未提到过删除方法。如果你尝试使用JDK 1.6编译为JDK 1.5编写的源代码,并且该源代码实现了在JDK 1.6中已被扩展(添加方法)的接口,则需要更改旧源代码以实现新方法。向后兼容性? - oligofren

5
如果您在使用Eclipse或其他IDE编写代码,应该可以将其配置为目标1.5兼容性。如果您直接使用javac,则可以尝试使用-source 1.5和/或-target 1.5 javac选项,这可能足以满足您的需求。1.6 JDK应该能够生成符合1.5标准的代码。

11
请注意,即使这是最佳兼容性的猜测,如果使用了任何新的JDK 1.6类或方法,仍然会出现问题。自从osx删除1.5以来,我已经被咬了很多次,这真的很令人恼火。 - David Blevins
6
将目标兼容性设置为1.5并不总是有效。我遇到了这个确切的问题,因为java.sql.CallableStatement在1.5和1.6之间发生了重大变化。该项目中的某些类根据1.5版本实现了该接口,因此当我尝试构建(即使使用1.5兼容性)时,它会抱怨这些类没有完全实现接口......因为接口是1.6版本,尽管使用了1.5兼容性。 - Kenny Wyland
我和Kenny有同样的问题:在Java的1.6版本中,java.sql.Wrapper添加了isWrapperFor(java.Lang.Class<?> )方法。设置源/目标并不能解决这个问题。 - oligofren
2
答案不完整/不正确(请参见Kenny的评论)。请查看下面的答案,了解如何在1分钟内下载和安装JDK 1.5。解决此问题。 - oligofren
是的,有一些限制。但如果你没有遇到特定问题,它确实可以避免安装多个JDK。 - Steven Schlansker

3

谢谢,这个方法很好用:http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard

奇怪的是,你必须按照说明中的重命名步骤进行操作,将1.5和1.5.0的符号链接修改为实际的leopard Java 1.5 - 如果你不这样做,只尝试运行java二进制文件,你会得到一个总线错误!

无论如何,由于这些步骤,我现在有了一个真正的Java 5 JDK来编译和运行Eclipse,这为我节省了很多麻烦。其中一件事是,我可以立即找到并删除对Java 1.6-only方法的引用。这太棒了。以前这些问题只会在QA中显示出来,或者更糟糕的是,当仍在使用Java 5的少数客户尝试运行我们的程序时才会出现。那是非常糟糕的。

这就是为什么“支持”JDK5,而实际上只是将符号链接指向Java 6并不足以进行开发的原因。


3

最简单的方法是使用Brice Dutheil创建的此脚本。保存该脚本,从苹果下载dmg文件(脚本会告诉您URI),然后运行该脚本。大功告成!


0

虽然可以使用-source和-target标志,但它们并不总是能生成适用于所有旧版JRE的代码。我曾经遇到过这样的情况,尝试将代码回编译为旧规范时,有些用户可以正常运行,但其他用户无法运行。为确保每个使用1.5或1.4 JRE的人都能运行您的代码,您应该使用1.5或1.4 JDK进行生产构建。

我在Snow Leopard下安装“真正的”1.5和1.4 JDK时发现这些说明非常有帮助: http://codethought.com/blog/?p=233


-4

你需要一个旧版本的OS X。


2
那是完全不正确的。你可以从苹果官网获取: http://support.apple.com/downloads/Java_for_Mac_OS_X_10_5_Update_9这里有一个安装脚本可供使用: http://blog.arkey.fr/2011/08/22/script-pour-installer-le-jdk-5-sur-macosx-lion/ - oligofren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接