2012-04-11 74 views
23

由於公共Java 6 SE JRE越來越接近它的EOL(11月'12),因此我正在考慮將我的項目從Java 6移植到Java 7.這不會是一件大事,如果Apple將提供Java 7 JRE for Mac OS X.但是由於Apple不願意這樣做,我仍然需要支持只有Java 6 JRE的用戶。是否可以使用可在Java 6 JVM上運行的Java 7 SDK編譯類文件?

有沒有辦法用Java 7 javac編譯Java 6兼容二進制文件(類文件)?當然,我知道我這樣做時不能使用新的Java 7功能。

感謝您的期待!

+1

相關:http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -run-t – assylias 2012-04-11 14:26:18

+0

[Set ant bootclasspath:JDK 1.7有一個新的javac警告,用於在沒有bootclasspath的情況下設置舊的源代碼](http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-warning-for-setting-an-old-sour) – 2013-07-30 22:52:06

+0

http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze 2013-08-24 19:42:04

回答

21

這取決於。如果您的程序不使用新的Java 7語言擴展,那麼可以使用-source 1.6-target 1.6選項運行Java編譯器。但是如果您使用Java 7語言擴展,那麼-source 1.6將導致編譯錯誤。

當然,我知道我不能在這樣做時使用新的Java 7功能。

這包括Java 7語言功能...和對Java 7的依賴關係更改爲標準類庫API。另外請注意,可能導致代碼在Java 6和Java 7上以不同方式運行的行爲差異很小(也稱爲API錯誤修復)。它們應該在Java 6至Java 7轉換文檔中進行描述。


UPDATE - 這可能不再是一個你無論如何問題,因爲Oracle已經發布的Java 7的Mac OSX。

+0

如果您仍然因此發生錯誤,您可以暫時切換回Java 6.通過運行'/ usr/libexec/java_home -v'1.6 *''查找路徑。然後,使用'export JAVA_HOME =「/ path/to/java6 /」'將其設置爲Java主路徑。通過運行'java -version'驗證它是否工作正常。 – user2398029 2012-12-26 21:45:31

+0

@louism - 在Windows和Linux(至少)設置JAVA_HOME不會直接影響運行'java'時運行的命令。 Mac OSX有什麼不同? – 2012-12-27 11:19:23

+0

它看起來像它!請參閱gist.github.com/4394202。 – user2398029 2012-12-28 03:20:12

5

我安裝了jdk6。如果你檢查javac的手冊頁:

Cross-Compilation Options 
      By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐ 
      ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath 
      and -extdirs when cross-compiling; see Cross-Compilation Example below. 

     -target version 
      Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier 
      versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6). 
3

是的,但在某些情況下沒有。在Java 1.6中,他們沒有嘗試使用資源,使用字符串切換或使用多個catch語句等。因此,程序的這些部分將無法編譯。但是java的想法是編譯一次,到處運行;所以代碼可以在舊的JVM上工作

3

Stephen C的回答是正確的,但並不完整。如果您的Java 7程序使用Java 7語言功能,那麼Java 7程序將無法在Java 6中編譯,但要警告其他錯誤仍可能發生,只需一位開發人員在Java 6中編寫代碼,另一位編譯Java 7.

以Java爲例。 sql.Driver。在Java 7中,該接口獲得了另一種方法。

爪哇7開發 此顯影劑實現了驅動程序接口,並使用在實施附加的驅動方法中的「覆蓋」註釋。該程序編譯得很好,因爲Java 6編譯器看到的類具有該方法並且代碼已簽入。將程序編譯爲Java 6並不意味着Java 6編譯器將自動切換爲使用Java 6源代碼碼!

Java 6的開發者 Java 6的開發者試圖構建Java 7開發商承諾的代碼,並得到即使Java 7的開發者並沒有實現任何Java 7語言結構編譯錯誤。

因此,即使你可能編譯爲Java 6,我會建議不要這樣做。

相關問題