2013-06-18 4 views
8

Краткий вопрос: если я использую относительно «второстепенные» языковые функции Java 7, ранее недоступные в Java 6, такие как блок try-muticatch ... это означает, что моя программа не будет работать на машинах с JRE 6 или JRE 5, установленными после компиляции как есть? Если это правильно, есть ли быстрый способ создать исполняемый файл JRE6 .jar без изменения исходного кода Java 7 (который, кстати, единственная функция Java 7, которую он будет использовать, представляет собой блок try-multicatch)?java 7 language обратная совместимость

ответ

8

Вы верны. Multi-catch - это языковая функция Java 7, и нет возможности скомпилировать ее на Java 6 (или более раннем) JVM-совместимом байт-коде.

Использование Java 7 компилятора, следующий позволяет компилировать Java 6 совместимые байты-код:

javac -source 1.6 -target 1.6 MyJavaFile.java

При попытке скомпилировать Java 7 особенности языка (мульти-улов, например) вы будете получить:

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 

(более подробно о том, что warning средства, см: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - это не relavent к этому обсуждению)

Если изменить -source флаг 1.7 вы получите:

source release 1.7 requires target release 1.7

Потому что ... вы не можете скомпилировать Java 7 источника (например, источник с функциями Java 7) на совместимый с Java 6 байт-код.

Если вы скомпилировать его с Java 7 (без какого-либо -source или -target флага), вы получите Java 7 байт-код, который не может быть запущен на < Java-JVM. И если вы попытаетесь это сделать, вы получите сообщение о том, что версии не совпадают:

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

вы не можете скомпилировать источник с Java 7 функций в Java 6 .class, потому что это

javac -source 1.7 -target 1.6 Test.java 

source release 1.7 requires target release 1.7 производит ошибку. Это связано с тем, что некоторые из 1.7 функций могут работать только с классами Java 7. Например, try-with-resources использует Throwable.addSuppressed метод доступен только с 1.7

Смежные вопросы