簡単な質問: try-muticatch ブロックなど、以前は Java 6 で使用できなかった比較的「マイナーな」Java 7 言語機能を使用すると、JRE 6 または JRE 5 がインストールされたマシンでプログラムが実行されないことを意味しますか?そのままコンパイルされますか?それが正しければ、Java 7 ソース コードを変更せずに JRE6 .jar 実行可能ファイルを生成する簡単な方法はありますか (ちなみに、使用する Java 7 機能は try-multicatch ブロックだけです)。
2 に答える
あなたは正しいです。マルチキャッチは 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 を参照してください - この議論には関係ありません)
-source
フラグを に変更すると、次の1.7
ものが得られます。
ソース リリース 1.7 にはターゲット リリース 1.7 が必要です
なぜなら... Java 7 ソース (Java 7 機能を持つソースなど) を Java 6 互換バイトコードにコンパイルできないからです。
Java 7 (no-source
または-target
flag を指定) でコンパイルすると、Java 7 未満の JVM では実行できない Java 7 バイトコードが得られます。そうしようとすると、バージョンが一致しないというエラーが表示されます。
roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
スレッド「メイン」での例外 java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : サポートされていない major.minor バージョン 51.0
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 クラスでのみ機能するためです。たとえば、1.7 以降でのみtry-with-resources
使用可能なメソッドを使用しますThrowable.addSuppressed