2009-11-19 14 views
11

javac/ecjをJava 5に設定し、Java 6を設定しないでコンパイルできるソースファイルを作成したいと考えています(基底のJavaランタイムがJava 6であっても)。JRE 6ではJava 5コンパイラでコンパイルできるがJava 6コンパイラではコンパイルできないJavaプログラムスニペットはありますか?

これは、Java 6がインストールされているEclipse 3.5ではコンパイラ・レベルが正しく設定されていますが、Java 5インストールで実行する必要があることを確認してください。

Java 1.4の場合、変数名として「enum」を使用できますが(Java 5以降では失敗します)、Java 5と6(以降)の場合は同様の方法を見つけることができません。

提案?

+0

なぜあなたはeclipseでコンパイラレベルを変更しないのですか? –

+0

@Diago、 "これはコンパイラレベルが正しく設定されていることを確認する"という質問からです。 –

+0

JDK5と6の間で削除された言語には何もありません。追加されたのは、インタフェースメソッドのオーバーライド注釈であったため、キーワードではありませんでした。したがって、あなたは図書館の相違に悩まされています、私は恐れます –

答えて

14

何も言われているようは、JDK5、コメントを追加しました6.唯一の間を削除されたJava言語はではありませんが、インターフェイスメソッドで許容されて@Override注釈ました。したがって、あなたは変化を壊す唯一の原因として図書館の相違点が残っています、私は恐れています。

これらはコアAPIであっても存在します。後方互換性の暴動の珍しいフィットで、彼らはExecutorServiceインターフェイス上のいくつかのメソッドの署名を変更しました。これは、メソッドのジェネリックシグネチャが過度に制限されていたためです。これは純粋なライブラリの変更でした(しかし、java.utilの一部であり、かなりコアライブラリ)。言語レベルの変更とは関係ありません。例えば

from JDK5

<T> T invokeAny(Collection<Callable<T>> tasks) 

to JDK6

<T> T invokeAny(Collection<? extends Callable<T>> tasks) 

これはJDK5にこのインタフェースを実装するコードが含まれている任意のプログラムは、JDK6に対してコンパイルされていないことを意味します。スニペットは簡単に作成できます。あなたのIDEがJDK5インターフェイスの空の実装を作成してから、JDK6に対して構築するだけです。

注:以前のバージョン(すなわちコレクションが呼び出し可能ないくつかのサブクラスが入力されて)それ以降のバージョンがないのに対し、List<MyCallable<String>>ようなパラメーターを受け入れてないので、ワイルドカードを加えた

+0

+1いい考え方 – skaffman

+1

良いキャッチです。 +1(ここではhttp://old.nabble.com/Incompatible-API-change- between-Java-5-and-Java-6--td22983799.html) – VonC

+0

私はこれで噛まれたことを証明することができます - 今すぐ私たちはコードのいくつかの2つのバージョンをサポートしなければなりません。純粋にこのライブラリの変更のためです –

2

Java SE 6でJVMDIが削除され、JVMPIが無効になっているため(J2SE 6.0 release noteによる)、このAPIを使用してコードを追加できます。J2SE 6.0、5.0のみでコンパイルされません。 (this threadで示されるように)

+0

私はあなたを正しく理解していれば、これは言語の変更ではなく、JREの違いですか?コンパイラレベルではなく、使用するJREに依存するでしょうか?私は開発中にJava 5を使用したくない、ちょうどコンパイラレベルが間違っていることをキャッチする。 –

+0

@Thorbjørn:はい、コンパイルできる実際のコードは見つかりません。実行時に動的ライブラリのみが読み込まれます。だから今のところ適切な解決策ではありません(私はアーカイブのためにCWモードにしておきます) – VonC

0

あなたの質問に答えられるのではなく、あなたのアプローチに代わるものです:antまたはmavenに基づいて、最終的な作成に使用する2番目のビルダーを使用することはできませんアプリケーションやライブラリ?このビルドでは、実際の外部Java 5 SDKを使用するため、アプリケーション/ライブラリがJava 5環境で動作することが保証されます。キーワードなし -

+0

はい。私たちには、適切なレベルで成果物を構築するビルドシステムがあります。しかし、時間がかかります。開発中に、私はしばしば自分のPC上でEclipseをビルドし、開発マシン(Java 5しかないPC )。したがって、Java 5を使用する必要があります。Eclipseのワーキングセット機能が冗長なので、新しいワークスペースを頻繁に作成します。 –

+1

ワーキングセット機能に完全に同意します。 1つのワークスペース/プロジェクトは私がやっていることです; –

関連する問題