2013-06-18 22 views
8

Kısa soru: Eğer nispeten "önemsiz" bir Java kullanırsam, Java 6'da daha önce kullanamıyorum, örneğin try-muticatch bloğu gibi ... Bu benim programımın makinelerde çalışmadığı anlamına gelir JRE 6 veya JRE 5 ile olduğu gibi derlendikten sonra yüklü? Bu doğruysa, bir Java 7 kaynak kodunu değiştirmeden bir JRE6 .jar çalıştırılabilirliği üretmenin hızlı bir yolu var mı (bu arada, kullanacağı tek Java 7 özelliği, try-çok nokta blokudur)?java 7 dil geriye dönük uyumluluk

cevap

8

Siz doğru. Çoklu yakalama, bir Java 7 dil özelliğidir ve onu Java 6 (veya daha eski) JVM uyumlu bayt koduna derlemenin bir yolu yoktur. olacak (örneğin, çoklu catch) Eğer bir Java 7 dil özelliğini derlemeye çalıştığınızda

javac -source 1.6 -target 1.6 MyJavaFile.java

: Java 7 derleyicisi kullanarak

, şu Java 6 uyumlu bayt kodu derlemek için izin verir olsun:

roach$ javac -source 1.6 -target 1.6 test.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
test.java:9: error: multi-catch statement is not supported in -source 1.6 
    } catch (NullPointerException | BufferOverflowException ex) {} 
           ^
    (use -source 7 or higher to enable multi-catch statement) 
1 error 
1 warning 

(yani warning araçlar, gördükleri hakkında daha fazla bilgi için: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - bu bu tartışmaya relavent değil)

Eğer 1.7 için -source bayrağını değiştirirseniz

Alacağınız:

source release 1.7 requires target release 1.7

... Eğer Java 7 kaynağını derlemek değil olabileceğinden (ör Java 7 özellikleri olan Java 6 ile uyumlu). Eğer (hayır -source veya -target bayrağıyla) Java 7 ile derlemek Eğer

Bir < Java 7 JVM üzerinde çalıştırılamaz Java 7 bytecode alacak. Ve bunu yapmaya çalışırsanız, sürümlerin uyuşmadığını belirten bir hata alırsınız:

roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : Unsupported major.minor version 51.0

7

Bu

javac -source 1.7 -target 1.6 Test.java 

source release 1.7 requires target release 1.7 hata üretir çünkü Java içine Java ile 6 SINIFI 7 özellikleri kaynağını derlemek cant. Bunun nedeni, 1.7 özelliklerinden bazılarının yalnızca Java 7 sınıflarıyla çalışabilmesidir. Örneğin, try-with-resources, Throwable.addSuppressed yöntemini kullanmaktadır, yalnızca 1,12

İlgili konular