自作したクラスを明示的にパッケージを作成して、 どの場所からでも利用したいと思います。 importは、自クラスから見て相対的なディレクトリー下にないと、 「クラスが見つからない」といったコンパイルエラーになります。 JDKが公開しているAPIは、どのディレクトーからでもimportできます。 どのように設定するとimportできるのでしょうか。 また、可能ですか?
可能です。 要するに自分でクラスライブラリを構築したいということなので、 クラスパスを設定すればよいわけです。 環境変数CLASSPATHまたはjavacやjavaのオプション-classpathを使います。
言葉で全部説明するとかえってわかりにくいので、 以下の作業の様子を見て考えてみてください。 以下では、
としています。
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作成)
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/"); } }
C:\WORK\com\hyuki\jq> javac Sample.java ~~~~~~~~~~~~~~~~~
C:\WORK\com\hyuki\jq> cd ..\..\.. ~~~~~~~~~~~ C:\WORK> java com.hyuki.jq.Sample ~~~~~~~~~~~~~~~~~~~~~~~~ Welcome to Java Q&A. http://www.hyuki.com/jq/
※これはカレントディレクトリがクラスパスに入っているため動作する。
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 を探すので、どこにいても実行できる。
C:\> cd TMP ~~~~~~ C:\TMP> (ここで 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); } }
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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※クラスパスを設定すればコンパイル成功。
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/ をご参照ください。