はじめに (対象読者・この記事でわかること)

この記事は、EclipseとAntを組み合わせてJava 8プロジェクトをビルドしている際に、「ブートストラップ・クラスパスが-source 8と一緒に設定されていません」というエラーに直面している開発者の方を対象としています。特に、既存のAntプロジェクトをJava 8環境へ移行しようとしていたり、開発環境をセットアップしている最中にこのエラーに遭遇した方にとって、有益な情報となるでしょう。

この記事を読むことで、エラーが発生する根本的な原因を理解し、Antのビルドスクリプト(build.xml)を修正して問題を解決する具体的な手順を習得できます。これにより、あなたのJava 8プロジェクトのAntビルドがスムーズに成功するようになり、開発の停滞を防ぐことができるでしょう。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 * Javaの基本的な文法と開発経験 * Eclipse IDEの基本的な操作方法 * Apache Antビルドスクリプト(build.xml)の基本的な構造とjavacタスクの理解 * JDK(Java Development Kit)とJRE(Java Runtime Environment)の違いに関する基本的な知識

Java 8とAntビルドにおける「ブートストラップ・クラスパス」エラーの背景

Java 8は、ラムダ式やStream APIといった画期的な新機能をもたらしました。しかし、これらの新しい言語機能をAntのような従来のビルドツールでコンパイルしようとする際、特定のエラーに直面することがあります。それが「ブートストラップ・クラスパスが-source 8と一緒に設定されていません」というメッセージです。

このエラーは、AntのjavacタスクがJava 8のソースコードをコンパイルしようとしているにもかかわらず、そのコンパイルに必要なJava 8の標準ライブラリ(rt.jarなど)を適切に参照できていない場合に発生します。通常、javacは実行されているJRE/JDKの標準ライブラリを自動的に参照しますが、Antのjavacタスクの設定によっては、この参照がうまくいかないことがあります。

特に、Eclipse内でAntビルドを実行している場合、Eclipse自身のワークスペースJRE設定や、Antが利用するデフォルトのJREパスが、Java 8のコンパイル要件と乖離していることが原因となることが多いです。javacタスクにsource="1.8"target="1.8"を設定していても、ブートストラップ・クラスパスが古いままだと、Java 8の新しいAPIや構文が解決できずにエラーとなるのです。

エラーの再現と具体的な解決策

ここからは、実際にエラーがどのように発生し、どのように解決していくのかを具体的に見ていきましょう。

ステップ1: エラーの確認と原因の特定

まず、EclipseでAntビルドを実行した際に、コンソールに以下のようなエラーメッセージが表示されることを確認します。

[javac] エラー: ブートストラップ・クラスパスが-source 8と一緒に設定されていません

このメッセージは、JavaコンパイラがJava 8のソースコードをコンパイルしようとしたときに、Java 8のコアライブラリ(rt.jar)が適切にブートストラップ・クラスパスに指定されていないことを意味します。主な原因は以下のいずれか、またはそれらの組み合わせです。

  1. Antのjavacタスクが参照しているJDK/JREがJava 8以前のもの、あるいはJREのみでJDKのコンパイラではない。
  2. javacタスク内でfork="true"属性が設定されておらず、Eclipseが内部的に使用するJREのコンパイラが使われている。
  3. javacタスクに、Java 8のrt.jar(またはそれと同等のもの)への明示的なブートストラップ・クラスパスが指定されていない。

これらの原因を踏まえ、build.xmlの修正とEclipseのAnt実行設定の確認を進めます。

ステップ2: Antビルドスクリプト(build.xml)の修正

最も確実な解決策は、build.xml内のjavacタスクを適切に設定することです。具体的には、以下の3つの属性と要素を追加または修正します。

  1. fork="true"の追加: これにより、Antは新しいJavaプロセスをフォーク(起動)してコンパイルを実行します。これにより、Eclipseの内部的なJRE設定に依存せず、明示的に指定したJDKのjavacを使用できるようになります。
  2. executable属性の指定: fork="true"と合わせて、どのjavacコマンドを使用するかを明示的に指定します。Java 8以降のJDKのjavacへのパスを指定します。
  3. <compilerarg line="-Xbootclasspath/p:..." の追加: これがエラーメッセージに直接対応する最も重要な修正です。Java 8のrt.jar(Java 9以降ではモジュールシステムへの移行によりrt.jarは存在しませんが、今回はJava 8なのでrt.jarが対象です)をブートストラップ・クラスパスに追加します。

以下に、修正例を示します。

Xml
<project name="MyJava8Project" default="build" basedir="."> <property name="src.dir" value="src"/> <property name="build.dir" value="bin"/> <property name="lib.dir" value="lib"/> <!-- 環境変数JAVA_HOMEからJDKのホームパスを取得。 --> <!-- または、Ant実行時のjava.homeから親ディレクトリを推測。 --> <property environment="env"/> <condition property="jdk.home" value="${env.JAVA_HOME}"> <isset property="env.JAVA_HOME"/> </condition> <condition property="jdk.home" value="${java.home}/.."> <not> <isset property="env.JAVA_HOME"/> </not> </condition> <!-- rt.jarのパスを構築。JDK 8の場合、通常 ${jdk.home}/jre/lib/rt.jar にあります。 --> <property name="java8.rt.jar" value="${jdk.home}/jre/lib/rt.jar"/> <target name="clean"> <delete dir="${build.dir}"/> </target> <target name="init"> <mkdir dir="${build.dir}"/> </target> <target name="build" depends="init"> <echo message="Using JDK home: ${jdk.home}"/> <echo message="Using rt.jar: ${java8.rt.jar}"/> <javac srcdir="${src.dir}" destdir="${build.dir}" source="1.8" target="1.8" encoding="UTF-8" debug="on" includeantruntime="false" <!-- Antのランタイムがクラスパスに含まれるのを防ぐ --> fork="true" <!-- 新しいプロセスでコンパイルを実行 --> executable="${jdk.home}/bin/javac"> <!-- 使用するjavacコマンドを明示 --> <!-- 重要な修正: Java 8のrt.jarをブートストラップ・クラスパスに明示的に追加 --> <!-- パスにスペースが含まれる可能性を考慮してクォートする --> <compilerarg line="-Xbootclasspath/p:&quot;${java8.rt.jar}&quot;"/> <!-- 必要に応じて、追加のクラスパスを設定 --> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> </fileset> </classpath> </javac> </target> <target name="run" depends="build"> <java classname="com.example.Main" classpath="${build.dir}"> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> </fileset> </classpath> </java> </target> </project>

ポイント: * jdk.homeプロパティは、JAVA_HOME環境変数から取得するのが最も安定しています。もし設定されていない場合は、java.home(Antが実行されているJREのパス)から親ディレクトリを推測します。環境に合わせて調整してください。 * java8.rt.jarのパスは、通常${jdk.home}/jre/lib/rt.jarですが、JDKのインストール方法やバージョンによって異なる場合があります。ご自身の環境で正しいパスを確認してください。 * includeantruntime="false"は、Antの実行に必要なライブラリが意図せずコンパイル時のクラスパスに含まれるのを防ぐために推奨されます。

ハマった点やエラー解決

このエラーに直面した際によくあるハマりどころとその解決策をいくつかご紹介します。

  1. JAVA_HOME環境変数の設定不備:

    • ハマり: build.xml内で${env.JAVA_HOME}を参照しているのに、それが正しく設定されていない、あるいは古いJDKを指している。
    • 解決策: OSの環境変数設定を確認し、Java 8以降のJDKのルートディレクトリがJAVA_HOMEに正しく設定されていることを確認してください。Eclipseを再起動しないと環境変数の変更が反映されない場合があります。
  2. rt.jarのパスの誤り:

    • ハマり: build.xmlrt.jarのパスを間違って指定している、または存在しないパスを指定している。特にJava 9以降のJDKではrt.jarは存在しませんが、Java 8では必須です。
    • 解決策: コマンドプロンプトやターミナルでecho %JAVA_HOME% (Windows) や echo $JAVA_HOME (Linux/macOS) を実行し、そのパスの下にjre/lib/rt.jarがあるか確認します。なければ、正しいJDKの場所を探してパスを修正します。
  3. EclipseのAnt実行環境設定:

    • ハマり: 上記のbuild.xml修正後もエラーが解消しない場合、EclipseがAntを実行する際のJREが適切でない可能性があります。
    • 解決策:
      1. Eclipseのメニューバーから「実行」→「外部ツール」→「外部ツール構成...」を開きます。
      2. 左側のリストから、問題のAntビルド構成を選択します。
      3. 「JRE」タブに移動します。
      4. 「ワークスペースの既定のJREを使用する」ではなく、「特定のJRE」を選択し、インストールされているJava 8以降のJDKを選択してください。もしリストにない場合は、「インストールされたJRE」ボタンから追加します。
      5. 「適用」をクリックし、「実行」でAntビルドを再度試します。

解決策

上記の手順を正確に実施し、特にbuild.xmljavacタスクにfork="true"executable、そしてbootclasspathの指定が正しく行われていれば、Java 8プロジェクトのコンパイルが成功し、「ブートストラップ・クラスパスが-source 8と一緒に設定されていません」というエラーは解消されるはずです。

もし複数のJDKがインストールされている環境であれば、executable="${jdk.home}/bin/javac"のように、明示的にJava 8のJDK内のjavacコマンドを指定することが、意図しないコンパイラが使用されることを防ぐ上で非常に有効です。

まとめ

本記事では、EclipseとAntを使用してJava 8プロジェクトをビルドする際に発生する「ブートストラップ・クラスパスが-source 8と一緒に設定されていません」というエラーの原因と、その具体的な解決策 を詳細に解説しました。

  • 要点1: このエラーは、AntのjavacタスクがJava 8の言語機能をコンパイルする際に、Java 8の標準ライブラリ(rt.jar)を適切に参照できていないために発生します。
  • 要点2: build.xml内のjavacタスクにfork="true"executable属性で適切なjavacのパスを指定し、さらに<compilerarg line="-Xbootclasspath/p:..."でJava 8のrt.jarへのパスを明示的に指定することで解決できます。
  • 要点3: エラーが解消しない場合は、JAVA_HOME環境変数の設定や、EclipseのAnt実行構成で利用するJREがJava 8以降のJDKに設定されているかを確認することが重要です。

この記事を通して、あなたはJava 8環境でのAntビルドエラーに効果的に対処し、開発プロセスをスムーズに進めるための知識とスキルを得られたことでしょう。同様の問題で時間を浪費することなく、本来の開発作業に集中できるようになるはずです。

今後は、Java 9以降で導入されたモジュールシステムとAntビルドの連携、あるいはよりモダンなビルドツールであるGradleやMavenへの移行検討についても記事にする予定です。

参考資料