最近、プロジェクトの 1 つで Java 7 に移行しました。Java 6または7に依存するものがないため、Java 1.5で実行できると主張しています。ただし、今日コンパイルすると、次のことに気付きました。
bootstrap class path not set in conjunction with -source 1.5
この警告に関する情報はほとんど見つかりませんでした。これは、Java 1.7 から Java 1.5 にコンパイルできないということですか?
この Oracle ブログでは、警告について説明しています。
http://blogs.oracle.com/darcy/entry/bootclasspath_older_source
その理由は、古いプラットフォームの rt.jar の設定に失敗した場合、次のようになるためです。
2 番目の手順を実行しない場合、javac は古い言語規則を新しいライブラリと組み合わせて忠実に使用します。その結果、存在しないメソッドへの参照が含まれる可能性があるため、古いプラットフォームでは機能しないクラス ファイルが作成される可能性があります。
これは、Java 1.7 から Java 1.5 にコンパイルできないということですか?
いいえ、そうではありません。これは、これを行うには正しい方法と間違った方法があることを意味します...そしてあなたは間違った方法でそれをやっています.
Java 1.7 JDK で Java 1.5 用にコンパイルする正しい方法は次のとおりです。
Java 1.5 から「rt.jar」のコピーを取得し、コンパイルの bootclasspath に配置します。
-source 1.5 および -target 1.5 でコンパイルします。
警告メッセージは、これらの最初の作業を行っていないことを示しています。
あなたが現在構築している方法は、暗黙のうちに Java ランタイム API 用の "rt.jar" の 1.7 バージョンを使用することです。これはうまくいくかもしれません!(実際、最後に 1.5 でビルドされてからコードに変更を加えていないと仮定すると、動作するはずです。) ただし、Java 1.6 または 1.7 で追加されたクラスまたはメソッドに誤って依存関係を導入するリスクがあります。Java 1.5 でアプリケーションを実行しようとすると、実行時エラーが発生します。
-source と -target 1.5 を設定したほうがよいでしょう。
新しいクラス、メソッド、またはフィールドへの依存関係を誤って組み込んでいないことを確実にするには、maven-animal-sniffer プラグインなどを使用してください。
--source 1.5 は、ソース ファイルが Java 5 規則に準拠していることを確認します。--target 1.5 は、生成されたクラス ファイルが Java 5 規則に準拠していることを確認します。これらのいずれも、Java 6 または 7 のライブラリ メソッドを使用できないようにするものではありません。--bootclasspath を使用して適切な rt.jar に対してコンパイルするか、animal-sniffer-plugin (maven を使用している場合) のようなものを使用して、すべての型シグネチャを検査し、公開されたプロファイルと比較する必要があります。
animal-sniffer-plugin を使用すると、Java 6 API を使用するサードパーティのライブラリに遭遇する可能性があり、Java 5 を使用している場合にビルド プロセスが失敗する可能性があるため、ご褒美になる可能性があります。