2010-05-17 80 views
22

我必須爲仍在運行JDK 1.5的遺留應用程序編寫一些代碼。不幸的是,它看起來像OS   X實際上沒有安裝1.5 JDK;它只是鏈接到1.6:如何在Mac OS X上獲得JDK 1.5

/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(雪 豹)。在這個操作系統版本上安裝了一個實際的1.5 JDK嗎?

或者我需要嘗試找到舊版本的操作系統  X,然後才能進行此項工作?

回答

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次以來,我一直被這麼多次咬了,真是令人非常氣憤。 – 2010-11-12 18:10:13

+6

-1將目標合規性設置爲1.5時,它並不總是有效。我有這個確切的問題,因爲java.sql.CallableStatement在1.5和1.6之間發生了根本性的變化。這個項目中的一些類我試圖構建的實現,根據1.5版本的接口,所以當我嘗試構建(即使是1。5合規),它抱怨這些類沒有完全實現接口......因爲儘管使用了1.5合規性,但接口是1.6版本。 – 2011-04-05 16:52:42

+0

我有和Kenny一樣的問題:isWrapperFor(java.lang.Class 已被添加到java 1.6版的java.sql.Wrapper中,設置source/target對此沒有幫助。 – oligofren 2012-01-18 16:44:38

-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 2012-01-18 16:59:50

6

爲了開發它,您不需要Java 1.5的副本; Java 1.6向後兼容Java 1.5,所以任何能在1.5上運行的東西都能在1.6上運行。 -source-target標誌可能用於確保所有工作都在1.5。也就是說,this article將解釋如何在Snow Leopard上獲得Java 1.5的副本。但請注意,它可能會破壞/損害您的系統。

+0

JRE向後兼容。與JDK不同;如果任何類在你正在使用的jdk中實現新的接口,那麼你會得到一個錯誤,說你需要實現這些新的方法。 – oligofren 2012-01-18 16:46:09

+0

正確,但方法從JDK的一個版本移除或重命名爲另一個版本的頻率如何?通常方法只能被添加。棄用通常需要幾個版本的JDK完全刪除。 – 2012-01-19 07:55:25

+0

呃..完全:)我從來沒有提到刪除方法。如果您嘗試使用JDK 1.6編譯爲JDK 1.5創建的源代碼,並且該源代碼實現了JDK 1.6中已擴展(添加方法)的接口,則需要更改舊源代碼以實現新方法。向後兼容? – oligofren 2012-01-19 12:20:17

12

關於如何在Snow Leopard上安裝1.4和1.5 JDK,請看http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard。 還要記住,無論何時運行軟件更新並安裝了JDK更新,您都需要將符號鏈接「修復」到1.4和1.5 JDK。

UPDATE:作爲一個側面說明,對於那些在OS X上的JDK幾個發展中國家,看看這個方便的小工具,以命令行開關JDK:setjdk

+0

該鏈接工程很好 – Clocker 2013-12-17 20:31:10

0

儘管可以使用-source和-target標誌,但它們並不總是生成適用於所有舊JRE的代碼。我肯定有時候試圖反編譯成舊規格的代碼,這些代碼對於某些用戶來說工作得很好,但是不會在其他人身上運行。要確定每個使用1.5或1.4 JRE的人都可以運行你的代碼,你應該用1.5或者1.4的JDK來編譯你的生產版本。

我發現這些指令非常有幫助的得到一個「真實」的1.5和1.4 JDK安裝在雪豹: http://codethought.com/blog/?p=233

+0

鏈接不起作用了。 – rasata 2011-07-08 01:58:44

3

感謝這個偉大的工程:http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard

奇怪的是,你必須遵循重命名在說明中的步驟中,將1.5和1.5.0的符號鏈接修改爲實際的豹Java 1.5 - 如果您不這樣做,只嘗試運行java二進制文件,則會出現總線錯誤!

在任何情況下,由於這些步驟,我現在有一個實際的Java 5 JDK在Eclipse中編譯和運行,這爲我節省了大量的問題的麻煩。首先,我可以立即找到並刪除對僅使用Java 1.6的方法的引用。這很棒。在這些只會在QA中出現之前,甚至更糟糕的是,當時還有少數仍在Java 5上的客戶試圖運行我們的程序。哪是。壞。

這就是爲什麼「支持」JDK5,而實際上只是將符號鏈接指向Java 6並不足以滿足開發需求的原因。

7

實際上有兩個問題在這裏:

  1. 安裝的是舊版本的Java的保持軟件更新的刪除。
  2. 告訴那些需要舊版本的應用程序在哪裏可以找到它,同時讓所有的東西都能從最新版本中受益。

我沒有什麼要補充的(還)給那些已經被寫入有關安裝舊版本的Java,但是,according to this post from Mike Swingler,在蘋果公司的Java Runtime工程師:

沒有人能夠或者應該應該改變/ System/Library/Frameworks/JavaVM.framework中的符號鏈接,除了Apple軟件更新(我們不願意這樣做,因爲它不可避免地會打破某人)

換句話說,更新操作系統鏈接Java的舊副本是一個值得懷疑的做法,因爲它強制每個Java應用程序在t他系統使用舊的Java版本。

正確的方法是根據需要將JAVA_HOME設置爲正確的Java版本。您可以通過執行/usr/libexec/java_home來獲取指定版本的路徑。例如,爲了獲取路徑到1.5版:

/usr/libexec/java_home --version 1.5