普段はIDEを使い、ビルドツールを駆使して開発をしているのであまりjarファイルの置き場がどうのこうのといったことをする必要はないのですが、複雑なプロジェクトゆえ各種IDEでビルドできないという事態が生じた場合に、手っ取り早く手元でコンパイルしたいという需要もあるかと思います。

そこで障害となるのが依存性の解決、そしてクラスパスの設定です。私はjavac Hello.javaと入力して「パッケージ hoge.hoge.hoge は存在しません」と言われて凹み、さらに設定で難儀したので備忘録的に共有します。

WindowsですがMacも同じです。

クラスパスにフォルダを追加する

ファイル単体をクラスパスに追加したい場合は

CLASSPATH=C:\Users\blackhorry\libs\commons-io.jar

でOKですが、ディレクトリを指定したい場合は?

CLASSPATH=C:\Users\blackhorry\libs\*

アスタリスクが必要なので注意しましょう。また、この指定方法ではjarファイルは含まれますがclassファイルが含まれません。

classファイルを含めたい場合は以下のように指定します。順番が前後すると読み込まれる順番も変わります。

CLASSPATH=C:\Users\blackhorry\libs\*;C:\Users\blackhorry\libs

CLASSPATH=C:\Users\blackhorry\libs;C:\Users\blackhorry\libs\*

参考
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

自作ソースをクラスパスに追加する

com/hoge/app/Hello.javaというディレクトリ構成になっている場合、を想定します。まずはコンパイルしたいファイルのあるディレクトリに移動します。

cd com/hoge/app

コンパイルする前に、クラスパスの設定が必要です。カレントディレクトリ直下をクラスパスに追加しようとして

CLASSPATH=.

と指定してjavac Hello.javaすると、ハマります。ここで確認すべきはHello.java内でパッケージがどう指定されているかです。

たとえばpackage com.hoge.appとして指定されている場合(大抵そうですよね)、カレントディレクトリを.として指定した結果com/hoge/app/com/hoge/appがクラスパスに追加されてしまいます。つまりディレクトリ階層を遡る必要があるので、正しくは以下のようにクラスパスを設定します。

CLASSPATH=..\..\..\