23

公開されている Java 6 SE JRE が EOL に近づいているため (2012 年 11 月)、プロジェクトを Java 6 から Java 7 に移植することを検討しています。Apple が Java 7 JRE を提供する場合、これは大したことではありません。 Mac OS X 用です。しかし、Apple はそうすることを望んでいないので、私はまだ Java 6 JRE しか持っていないユーザーをサポートする必要があります。

Java 6 互換のバイナリ (クラス ファイル) を Java 7 javac でコンパイルする方法はありますか? 確かに、そうすると Java 7 の新機能を使用できないことは承知しています。

期待してありがとう!

4

4 に答える 4

21

場合によります。プログラムで新しい Java 7 言語拡張機能を使用しない場合は、オプション-source 1.6-target 1.6オプションを使用して Java コンパイラを実行できます。ただし、Java 7 言語拡張機能を使用する-source 1.6と、コンパイル エラーが発生します。

確かに、そうすると Java 7 の新機能を使用できないことは承知しています。

これには、Java 7 言語機能と、標準クラス ライブラリ API に対する Java 7 の変更への依存関係が含まれます。また、Java 6 と Java 7 でコードの動作が異なる可能性がある少数の動作の違い (別名 API バグ修正) があることにも注意してください。それらについては、Java 6 から Java 7 への移行ドキュメントで説明する必要があります。


更新- Oracle が Mac OSX 用の Java 7 をリリースしたため、これはおそらくもはや問題ではありません。

于 2012-04-11T14:24:08.120 に答える
5

私はjdk6をインストールしました。javac の man ページを確認すると、次のようになります。

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).
于 2012-04-11T14:24:18.833 に答える
3

Stephen Cの答えは正しいですが、完全ではありません。Java 7 プログラムは、Java 7 言語機能を使用している場合、Java 6 でコンパイルされませんが、Java 6 でコーディングしている開発者と Java 7 をコンパイルしている別の開発者によって、他の微妙なバグが発生する可能性があることに注意してください。

たとえば、java.sql.Driver を考えてみましょう。Java 7 では、インターフェースに追加のメソッドが追加されました。

Java 7 開発者 この開発者は、Driver インターフェイスを実装し、実装された追加の Driver メソッドで「Override」アノテーションを使用します。Java 6 コンパイラが認識するクラスにはそのメソッドがあり、コードがチェックインされるため、プログラムは Java 6 プログラムとして正常にコンパイルされます。プログラムを Java 6 としてコンパイルしても、Java 6 コンパイラが Java 6 ソースを使用するように自動的に切り替わるわけではありません。コード!

Java 6 開発者 Java 7 開発者がコミットしたコードをビルドしようとすると、Java 7 開発者が Java 7 言語構造を実装していなくても、コンパイル エラーが発生します。

したがって、たとえJava 6 としてコンパイルできたとしても、これは行わないことをお勧めします。

于 2013-07-30T18:32:54.140 に答える
3

はい、場合によってはいいえ。Java 1.6 では、リソースの試行、文字列の切り替え、または複数の catch ステートメントなどはありませんでした。そのため、プログラムのこれらの部分はコンパイルされません。しかし、Java の考え方は、一度コンパイルすればどこでも実行できるというものです。そのため、コードは古い JVM で動作します

于 2012-04-11T14:27:58.663 に答える