概要
hoge.MyClassをjavac MyClass.javaでコンパイル後、java MyClassとしても「シンボルを見つけられません」となってしまい実行することができない。
原因
原因は以下の2つである。
原因1: クラスはFQCNで指定しなければならない
javacコマンドはソースファイル名を指定するにも関わらず、javaコマンドはクラス名(FQCN)を指定する必要がある。
原因2: クラスパスを検索しても指定したクラスが見つからない
パッケージに合わせたディレクトリ階層にする必要がある。
解決方法
原因1の解決方法
javaコマンド実行時はMyClassではなくhoge.MyClassを指定する。
原因2の解決方法
- MyClass.classをhogeディレクトリに格納する。
- cdコマンドでhogeディレクトリが格納されているディレクトリに移動する。
※hogeディレクトリの中ではなく、hogeディレクトリと同じ階層
原因1と原因2をまとめると
ソースファイルがtest/hoge/MyClass.javaにある場合、
- cd test
- java hoge.MyClass
2023/6/1追記
Java 11以降ではjava MyClass.javaのようにjavaファイルを指定して実行することが可能。
きしだ様、コメントありがとうございました。
クラスパスとは
JVMのクラスローダーは以下で指定されたクラスパスからクラスを探す。
- javaコマンドの-cp(または-classpath)オプションで指定されたクラスパス
- 環境変数で指定されたクラスパス
- カレントディレクトリ(-cpオプションなしの場合)
クラスパスは以下の2種類を指定できる。
- ディレクトリの場所
- クラスファイルが入ったjarファイルやzipファイル
:(半角コロン)区切りで複数指定することができる。windowsの場合は半角セミコロン区切りとなる。 /var/javadev:/var/javadev/jars/calcapp.jar
まとめ
- クラスパスで指定された場所にパッケージ階層に合わせたディレクトリ階層を作成し、その中にクラスファイルを配置。
- -cpでクラスパスを指定、またはクラスパスで指定したディレクトリに移動にしてからFQCNでjavaコマンドを実行する。
コメント
MyClass.javaがファイルひとつだけで完結している場合に一番楽な解決方法は
> java MyClass.java
としてjavaファイルを直接javaコマンドで実行することです。Java 11以降で対応しています。
きしだ様
コメントありがとうございます。
記事内に追記させていただきます。