自作したクラスをimportしたい

結城 浩

目次

質問:自作したクラスをimportしたい

自作したクラスを明示的にパッケージを作成して、 どの場所からでも利用したいと思います。 importは、自クラスから見て相対的なディレクトリー下にないと、 「クラスが見つからない」といったコンパイルエラーになります。 JDKが公開しているAPIは、どのディレクトーからでもimportできます。 どのように設定するとimportできるのでしょうか。 また、可能ですか?

回答:クラスパスを設定しましょう

可能です。 要するに自分でクラスライブラリを構築したいということなので、 クラスパスを設定すればよいわけです。 環境変数CLASSPATHまたはjavacやjavaのオプション-classpathを使います。

言葉で全部説明するとかえってわかりにくいので、 以下の作業の様子を見て考えてみてください。 以下では、

としています。

◆Sample.javaの作成

C:\WORK> mkdir com
         ~~~~~~~~~
C:\WORK> mkdir com\hyuki
         ~~~~~~~~~~~~~~~
C:\WORK> mkdir com\hyuki\jq
         ~~~~~~~~~~~~~~~~~~
C:\WORK> cd com\hyuki\jq
         ~~~~~~~~~~~~~~~
C:\WORK\com\hyuki\jq> (ここでエディタを使い、Sample.java作成)

◆Sample.javaの内容表示

C:\WORK\com\hyuki\jq> type Sample.java
                      ~~~~~~~~~~~~~~~~
package com.hyuki.jq;

public class Sample {
    public static void main(String[] args) {
        System.out.println("Welcome to Java Q&A.");
        System.out.println("http://www.hyuki.com/jq/");
    }
}

◆Sample.javaのコンパイル

C:\WORK\com\hyuki\jq> javac Sample.java
                      ~~~~~~~~~~~~~~~~~

◆Sampleの実行(方法その1)

C:\WORK\com\hyuki\jq> cd ..\..\..
                      ~~~~~~~~~~~
C:\WORK> java com.hyuki.jq.Sample
         ~~~~~~~~~~~~~~~~~~~~~~~~
Welcome to Java Q&A.
http://www.hyuki.com/jq/

※これはカレントディレクトリがクラスパスに入っているため動作する。

◆Sampleの実行(方法その2)

C:\WORK> cd ..
         ~~~~~
C:\> java -classpath C:\WORK com.hyuki.jq.Sample
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Welcome to Java Q&A.
http://www.hyuki.com/jq/
※オプション -classpath で C:\WORK をクラスパスにする。
※そこを基準にして com.hyuki.jq.Sample を探すので、どこにいても実行できる。

◆MyWork.javaの作成

C:\> cd TMP
     ~~~~~~
C:\TMP> (ここで MyWork.java を作成)

◆MyWork.javaの内容

C:\TMP> type MyWork.java
        ~~~~~~~~~~~~~~~~
import com.hyuki.jq.*;

public class MyWork {
    public static void main(String[] args) {
        Sample.main(args);
        com.hyuki.jq.Sample.main(args);
    }
}

◆MyWork.javaのコンパイル

C:\TMP> javac MyWork.java
        ~~~~~~~~~~~~~~~~~
MyWork.java:1: パッケージ com.hyuki.jq が import に見つかりません。
import com.hyuki.jq.*;
       ^
エラー 1 個
※com.hyuki.jqというパッケージが見つからないといわれてしまった。
C:\TMP> javac -classpath c:\WORK MyWork.java
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※クラスパスを設定すればコンパイル成功。

◆MyWorkの実行

C:\TMP>java MyWork
       ~~~~~~~~~~~
Exception in thread "main" java.lang.NoClassDefFoundError: com/hyuki/jq/Sample

※com.hyuki.jq.Sampleが見つからないと言われた。

C:\TMP>java -classpath c:\WORK MyWork
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Exception in thread "main" java.lang.NoClassDefFoundError: MyWork
※今度はMyWorkが見つからないと言われた。
※このあたりで普通はいやになってきます (^_^;
※でも、もう一ひねり。
C:\TMP>java -classpath .;c:\WORK MyWork
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Welcome to Java Q&A.
http://www.hyuki.com/jq/
Welcome to Java Q&A.
http://www.hyuki.com/jq/
※クラスパスに . も含めればMyWorkも見つかる。

◆もっと簡単にするには

C:\TMP>set CLASSPATH=.;c:\WORK
       ~~~~~~~~~~~~~~~~~~~~~~~
C:\TMP>java MyWork
       ~~~~~~~~~~~
Welcome to Java Q&A.
http://www.hyuki.com/jq/
Welcome to Java Q&A.
http://www.hyuki.com/jq/

※環境変数CLASSPATHを設定しておけば-classpathは不要。
これでおわかりでしょうか?
(にっこり)

初歩から学ぶために

importとpackageの説明は、 拙著『Java言語プログラミングレッスン』の下巻で行っています。 http://www.hyuki.com/jb/ をご参照ください。

リンク