[???] /
[Java FAQ] / [S004]
S004: 基礎知識
[S004-Q01]
クラスパスとは?
[S004-A01]
Java VMがクラスファイルを探すパスのリストです。
クラスパスを用いて必要なAPIを指定することで、アプリケーションの開発および実行に際して、
以下のような効果を得ることができます。
・本来関連のないAPI同士の分離
・あるアプリケーションで不要なAPIの排除
・同一APIの異なるバージョンを切り換えて使用
クラスパスを指定する具体的な方法はS004-02を参照してください。
[S004-Q02]
クラスパスの設定方法は?
[S004-A02]
実行時オプション -classpath か環境変数 CLASSPATH で設定します。
実行時オプション -classpath が優先されるので -classpath を使うことをお勧めします。
java コマンドは以下のように設定しますが、javac、javadoc も同様です。
◇ Windows の場合
実行時オプションで指定するには次のようにします。
パスの区切文字は ;(セミコロン)を使います。
> java -classpath path1;path2;...
環境変数を設定するには次のようにします。
> set CLASSPATH=path1;path2;...
◇ Unix(Solaris, Linux)の場合
実行時オプションで指定するには次のようにします。
パスの区切文字は :(コロン)を使います。
$ java -classpath path1:path2:...
環境変数を設定するには次のようにします。
(csh 系)
% setenv CLASSPATH path1:path2:...
(sh系)
$ CLASSPATH=path1:path2:...; export CLASSPATH
◇ Mac OS の場合
Mac OS では MRJ (Macintosh Runtime for Java)SDK の
JBindery(ブートストラップ) を使って Java を起動できます。
このとき、JBindery でパスを設定し、起動すると、その設定でJava が起動します。
クラスパスはアプリケーションの中の「CLASSPATH の設定」というところで、
ファイルダイアログで、パスを通したいフォルダ(ディレクトリ)を撰択することで
設定できます。
また、同様の設定の中で、以下の URL 形式でも指定できます。
file:///Macintosh HD/user/classes
これらの方法は起動のたびに設定を行わなければなりませんが、
JBindery は設定を保存できます。
保存しておけば、次回から保存ファイル(実際には実行可能なアプリケーション)を
実行することにより、設定されたパスで起動されます。
javac などのツールはクラスパスを設定するテキストエリアで
/Macintosh HD/user/classes
という形式で、一行ずつ設定できるようになっています。
[S004-Q03]
環境変数 CLASSPATH の設定が必要ではないときはどんな場合ですか?
[S004-A03]
あるアプリケーション/アプレットの開発中でライブラリを参照しない場合は必要ありません。
以下のような場合もあります。
1)開発中のクラスがパッケージ宣言をしていて、単一のパッケージで構成されている場合
環境変数 CLASSPATH を設定せずに
$ javac -d . Foo.java
でコンパイルする。([A-S004-4]参照)
2)開発中のクラスがパッケージ宣言をしていて、複数のパッケージで構成されている場合
環境変数 CLASSPATH を設定せずに
$ javac dir1/dir2/Foo.java
でコンパイルする。
[S004-Q04]
パッケージ形式のソースプログラムがコンパイルできるけど実行できません。
[S004-A04]
クラスファイルが正しい位置にあるかどうか確かめてください。
もし正しい位置にあっても実行できない場合は、コンパイル時に
$ javac -d [directory][filename]
と -d オプションを指定してコンパイルしてください。
-d オプションでクラスパスの出力先ディレクトリを設定しておけば、
そこからパッケージ階層に従ったディレクトリ階層も構築できます。
また実行時もディレクトリを意識せず実行することができます。
[例]
$ java PackageName.Application
(参考)
J2SEの基本的なツール
http://java.sun.com/j2se/1.3/ja/docs/ja/tooldocs/tools.html#basic
[S004-Q05]
コンパイルすると、Foo$1.class ができます。これはなんですか?
[S004-A05]
インナークラスです。S016 を参照して下さい。
[S004-Q06]
Foo$1.class が消えました。なぜでしょう?
[S004-A06]
プロバイダによっては$を含むファイルを消されてしまうこともあるので、
常にファイルがあるかどうか確認したり、JAR形式で保存すると良いでしょう。
[S004-Q07]
インスタンスメソッドを表すのに#はどう扱うの?
[S004-A07]
staticなメソッドの場合は、ピリオド(.)で表します。
インスタンスメソッドはnon-staticなので、シャープ(#)で表します。
[例]
[staticな場合]
java.lang.Double.toString(double d)
[non-staticな場合]
java.lang.Double#toString()
contributor: Tomoaki Mizote
コメントの送り先:Java FAQ BBS