5

Java 7 をインストールしましたが、プロジェクトの JDK 準拠を Java 6 に設定しました。残念ながら、これは Java 6 でのコンパイルと同じではないことが判明しました。

たとえば、インターフェイスはJava 7 でjavax.imageio.stream.ImageInputStream 拡張されますが、これは Java 6 の場合ではありません。 aが期待される場所を使用すると、私の設定 (Java 6 に準拠する Java 7) では正常にコンパイルされますが、Java 6 を使用するとコンパイル エラーが発生します。こうなる?ClosableImageInputStreamClosable

4

3 に答える 3

10

古い JRE 用に Java コードをコンパイルするには、次の 2 つのことを行う必要があります。

  • コンプライアンス レベルを適切に設定します。これは、dystroy で説明されているように、古い JVM が理解できるバイトコードをコンパイラが確実に生成するようにします。
  • 古い Java システム ライブラリを使用します。これにより、古い JRE に同梱されていたバージョンの Java システム ライブラリ (java.lang.*、java.net.* など) に対してコンパイルできるようになります。

最初のポイントはカバーしましたが、2番目のポイントはカバーしていないため、問題があります。

これを行う方法は、ビルド環境によって異なります。

  • Eclipse では、使用する Java システム ライブラリはビルド パスの一部として設定されます。[プロジェクト プロパティ] / [Java ビルド パス] / [ライブラリ] に移動し、間違った「JRE システム ライブラリ」を削除して、「ライブラリの追加...」を使用して正しいライブラリを追加します。 "。
  • plainjavacでコンパイルする場合は、 option を使用します-bootclasspath。例: javac -target 1.5 -bootclasspath jdk1.5.0/lib/rt.jar OldCode.java( javac マンページの「クロスコンパイルオプション」セクションから)。
于 2012-08-31T07:34:19.950 に答える
6

JDK 準拠で設定したのは、ほとんどがクラス形式です。

クラスのバイトコード形式にはいくつかの進化がありました。JDK は以前の形式でコンパイルできますが、VM はより新しい形式でコンパイルされたクラスを実行できません。

ただし、使用されるライブラリは常に、実行に使用する JDK で使用できるものです。javax.imageio.stream.ImageInputStream の JDK 6 バージョンは Java 7 にバンドルされていません。

于 2012-08-31T07:27:26.213 に答える
3

bootclasspathコンパイル時にオプションを使用します。クロスコンパイルを行う場合、JDK 7はそうしないことを警告していると思いました。

于 2012-08-31T07:35:30.310 に答える