【Eclipse】クラスパスの設定方法

Eclipse

Javaでクラスパスを通す場合、javaコマンドの-cpオプションを使用することで、任意のフォルダやアーカイブファイルを追加することができます。

クラスパスの詳細や-cpオプション等についてはこちらです。

しかしEclipseで開発を行っている場合、オプション指定ではなく、設定画面から独自の手順でクラスパスの追加を行う必要があります。このページでは、Eclipseで同様の操作を行うための、クラスパスの設定方法を整理しています。

自作クラスの場合

前述 のページに記載の クラスパスの設定方法 の通り、javaコマンドを使用する場合は、自作クラスか外部ライブラリかを問わず、全て-cpオプションでクラスパスの設定を行う必要があります。しかし、Eclipseの場合は少し勝手が異なります。

従ってEclipseで “クラスパスを通す” という操作を行いたい場合、多くは 後述 の外部ライブラリに対するものを指すことになります。

しかし稀に、特にEclipseを開き直した時など、この設定が外れてしまうことがあります。このため、比較的トラブルシューティングとしての側面が強い内容にはなりますが、この項では自作クラスの出力先に対応するクラスパスの設定手順を確認していきます。

ソースフォルダを追加できていない場合

まずはソースファイルがJavaのプログラムとして正しく認識されていない時の例です。この場合、一見エラーは出ていないように見えますが、パッケージエクスプローラに通常のフォルダとして表示されてしまい、フォルダ構成がパッケージとして認識されていないことが分かります。そのため、この状態でMainクラスを起動しようとすると、Selection does not contain a main type となり実行に失敗してしまいます。

このような場合は、クラスパスの追加と似た要領で、ソースフォルダの追加を行うことで、対応する出力先にパスを通すことができます。具体的な手順は次の通りです。

1.ビルドパスの構成を開く
 ① 対象のプロジェクトを右クリック
 ② Build Path をクリック
 ③ Configure Build Path.. をクリック

2.ソースフォルダを追加する
 ① Java Build Path を開く
 ② Source タブを開く
 ③ Add Folder.. をクリック

3.対象のソースフォルダを選択する
 ① 直下がパッケージと同じディレクトリ構成となるソースフォルダにチェックを入れる
 ② クラスファイル出力先に対応するフォルダが選択されていることを確認して OK をクリック

※クラスパスの仕組み( 対応するディレクトリの起点 )と同様、ここで選択されたパス以降のディレクトリ構成が、そのままパッケージとして解釈されることになります。そのため、ここで選択するパスを誤ることで、後述 のようなpackage文でのエラーに繋がります。

4.ソースフォルダの追加を確定する
 ① 適切なソースフォルダが追加されたことを確認して Apply and Close をクリック

5.正しくソースフォルダが追加されたことを確認する
 ① ソースフォルダ下のパッケージ構成が正しいことを確認

ソースフォルダ追加先を誤っている場合

続いて、ソースフォルダの追加はできているものの、追加したディレクトリが間違っている時の例です。これはいわば、間違った場所をクラスパスに追加してしまっているような状態です。パッケージエクスプローラの表示を見ても、ディレクトリ構成がパッケージとして認識されてはいるものの、その追加先を誤っているために起点となる開始位置がずれ、正しいパッケージになっていないことが分かります。

これは 後述 する外部ライブラリの追加先を誤った場合も同様です。

このような場合はまず一度 Remove で追加されているソースフォルダを除去し、その上で再度 前述 の手順に沿って適切なパスのソースフォルダを追加し直すことで、エラーを解消することができます。

ライブラリの場合

前述 のページでも説明している通りクラスパスには、パッケージに対応するディレクトリ構成を含む、フォルダ( 開始ディレクトリの場合 )や、ZIPまたはJAR( アーカイブファイルの場合 )を指定することができます。

package com.example;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

public class Main {

    public static void main(String[] args) {

        String str;

        if (ArrayUtils.isEmpty(args)) {
            str = "World";
        } else {
            str = StringUtils.join(args, ", ");
        }

        System.out.printf("Hello %s", str);
    }
}

まず、この例のように外部ライブラリを使用している場合、クラスパスの設定が正しく行われていなければ、インポート文やクラスの呼び出し箇所で、それらを解決できずにコンパイルエラーとなってしまいます。そこで、必要なクラスが含まれるパッケージがまとめられたフォルダ、またはアーカイブファイル( .zip.jar )をクラスパスに追加する必要があります。

ここでは仮に、次のようなディレクトリ構成で、Eclipseワークスペースとは異なる場所に配置された commons-lang3-3.17.0 へクラスパスを通すことを考えます。

commons-lang3-3.17.0 の中身は次のようになっており、パッケージに対応するディレクトリ構成に沿って、各クラスファイルが格納されています。ZIPとJARも、拡張子が異なるだけで中身はこのフォルダと同じ内容です。

commons-lang3-3.17.0
├ META-INF/...
└ org/apache/commons/lang3/...

フォルダ・ZIP・JAR のうち、どれか一つをクラスパスに追加すれば、完全修飾クラス名を解決できるようになります。ここからは、それぞれの設定手順について順を追って見ていきます。

フォルダの指定

クラスパスを通したい先がフォルダの場合、次の手順で設定することが可能です。

1.ビルドパスの構成を開く
 ① 対象のプロジェクトを右クリック
 ② Build Path をクリック
 ③ Configure Build Path.. をクリック

2.外部のクラスフォルダを追加する(内部クラスフォルダ追加の手順は 後述
 ① Java Build Path を開く
 ② Libraries タブを開く
 ③ Classpath を選択
 ④ Add External Class Folder.. をクリック

3.クラスパスを通すフォルダを選択する
 ① 開かれたエクスプローラで対象の位置まで移動してフォルダをクリック
 ② 正しくフォルダが選択されていることを確認して「フォルダーの選択」をクリック

4.クラスパスの追加を確定する
 ① クラスパスにフォルダが追加されたことを確認して Apply and Close をクリック

5.クラスパスの設定が完了したことを確認する
 ① Referenced Libraries にフォルダが追加されていることを確認

クラスパスを通すことで参照ライブラリに追加されたフォルダを展開すると、この場所を起点としたディレクトリ構成がパッケージとして認識されていることが分かります。これにより、外部フォルダのクラスを完全修飾クラス名で参照することが可能になります。

そのため、例えば誤って commons-lang3-3.17.0 の下にある org までを指定してクラスパスを設定してしまうと、そこを起点に apache.commons.lang3 パッケージと解釈され、正しい完全修飾クラス名で参照できなくなってしまいます。これは 前述 のソースフォルダの追加先を間違っている場合と同じ事象です。

ZIPファイルの指定

クラスパスを通す対象がZIPファイル( .zip )の場合は、次のように設定を行います。

1.ビルドパスの構成を開く
 ① 対象のプロジェクトを右クリック
 ② Build Path をクリック
 ③ Configure Build Path.. をクリック

2.外部のZIPファイルを追加する(内部ZIPファイル追加の手順は 後述
 ① Java Build Path を開く
 ② Libraries タブを開く
 ③ Classpath を選択
 ④ Add External JARs.. をクリック

3.クラスパスを通すZIPファイルを選択する
 ① 開かれたエクスプローラで対象の位置まで移動してZIPファイルをクリック
 ② 正しくZIPファイルが選択されていることを確認して「開く」をクリック

4.クラスパスの追加を確定する
 ① クラスパスにZIPファイルが追加されたことを確認して Apply and Close をクリック

5.クラスパスの設定が完了したことを確認する
 ① Referenced Libraries にZIPファイルが追加されていることを確認

クラスパスの追加により、ZIPファイル内のディレクトリ構成がそのままパッケージとして解釈されます。このように、前述 の対象がフォルダの場合と同様、追加したZIPファイルを起点として完全修飾クラス名で参照できるようになります。

JARファイルの指定

クラスパスを通す対象がJARファイル( .jar )場合も、ここまでの手順と同様です。

1.ビルドパスの構成を開く
 ① 対象のプロジェクトを右クリック
 ② Build Path をクリック
 ③ Configure Build Path.. をクリック

2.外部のJARファイルを追加する(内部JARファイル追加の手順は 後述
 ① Java Build Path を開く
 ② Libraries タブを開く
 ③ Classpath を選択
 ④ Add External JARs.. をクリック

3.クラスパスを通すJARファイルを選択する
 ① 開かれたエクスプローラで対象の位置まで移動してJARファイルをクリック
 ② 正しくJARファイルが選択されていることを確認して「開く」をクリック

4.クラスパスの追加を確定する
 ① クラスパスにJARファイルが追加されたことを確認して Apply and Close をクリック

5.クラスパスの設定が完了したことを確認する
 ① Referenced Libraries にJARファイルが追加されていることを確認

クラスパスの追加により、JARファイル内のディレクトリ構成がそのままパッケージとして解釈されます。このように、前述 の対象がフォルダの場合と同様、追加したJARファイルを起点として完全修飾クラス名で参照できるようになります。

ワークスペース内の場合

ここまでに説明した外部ファイルを追加する方法であれば、PC内のあらゆるフォルダやアーカイブファイルにクラスパスを通すことが可能です。しかし、Eclipseから参照されていることを忘れて、誤ってファイルを削除してしまったり、移動してパスが変わってしまったりすると、エラーになってしまいます。

そのため、参照するフォルダやアーカイブファイルは、同じワークスペース内に配置しておくことも少なくありません。このような場合には、ワークスペースの内部ファイルとしてクラスパスの設定を行うことが可能です。(※ここでいう 内部/外部 とは、ワークスペースの内にあるか外にあるか、ということを指しています。)

例えば、クラスパスの設定を行いたいプロジェクトと同じワークスペース内(ここでは src ディレクトリと同じ階層)の lib ディレクトリに、対象のフォルダやアーカイブファイル(ZIP または JAR)があるとします。

このような構成の場合、次の手順でワークスペース内のフォルダやアーカイブファイルをクラスパスに追加できます。

1.ビルドパスの構成を開く
 ① 対象のプロジェクトを右クリック
 ② Build Path をクリック
 ③ Configure Build Path.. をクリック

2.内部のJARファイルを追加する
 ① Java Build Path を開く
 ② Libraries タブを開く
 ③ Classpath を選択
 ④ Add JARs.. をクリック(フォルダ追加の場合は Add Class Folder..)

3.クラスパスを通すJARファイルを選択して確定する
 ① 開かれたウィンドウで対象の位置まで展開してJARファイルをクリック
 ② 正しくJARファイルが選択されていることを確認して「OK」をクリック
 ③ クラスパスにJARファイルが追加されたことを確認して Apply and Close をクリック

追加したフォルダやアーカイブファイルには、References Libraries と同じアイコンが表示され、正しく設定が行われていることの確認や、どのファイルが参照ライブラリであるかの確認が容易になります。

ワークスペース内のフォルダやアーカイブファイルを追加する場合も同様、前述 のように、クラスパスの追加によってその下のディレクトリ構成がそのままパッケージとして解釈され、そこを起点として完全修飾クラス名で参照できるようになります。

ワークスペース内のフォルダやファイルを追加したい場合、エクスプローラ上には存在しているにもかかわらず、Eclipseのパッケージエクスプローラや、クラスパス設定画面に対象が表示されないことがあります。

これは、エクスプローラの最新の状態がEclipseに反映されていないことが原因です。このような場合は、プロジェクト選択状態での F5 押下(または右クリック > Refresh)によるリフレッシュが必要になります。