web-dev-qa-db-ja.com

Java 6つのJVMで実行できるJava 7 SDK)でクラスファイルをコンパイルすることは可能ですか?

パブリックJava 6 SE JREがEOL(12年11月)に近づいているため、プロジェクトをJava6からJava7に移植することを検討しています。AppleがMacOSX用のJava 7 JREを提供する場合、これは大したことではありません。しかし、Appleはそうする気がないのでしたがって、Java 6JREしかないユーザーをサポートする必要があります。

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

期待してくれてありがとう!

23
t3chris

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

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

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


[〜#〜] update [〜#〜]-OracleがMacOSX用にJava 7をリリースしたため、これはおそらく問題ではなくなりました。

21
Stephen C

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).
5
Kent

はい、しかし場合によってはいいえ。 Java 1.6では、リソースの試用、文字列による切り替え、マルチキャッチステートメントなどがありませんでした。そのため、プログラムのこれらの部分はコンパイルされません。しかし、Javaのアイデアは、一度コンパイルすればどこでも実行できます。そのため、コードは古いJVMで機能します

3
Shawn Shroyer

スティーブンCの答えは正しいですが、完全ではありません。あなたのJava 7つのプログラムはJava 7の言語機能を使用する場合、Java 6でコンパイルされませんが、微妙に警告されます1人の開発者がJava 6でコーディングし、別の開発者がJava 7をコンパイルすると、他のバグが発生する可能性があります。

たとえば、Java.sql.Driverを取り上げます。 Java 7)では、インターフェースに追加のメソッドが追加されました。

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

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

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

3
Bounce