[Java] 「シンボルを見つけられません」の解決法

スポンサーリンク

概要

hoge.MyClassをjavac MyClass.javaでコンパイル後、java MyClassとしても「シンボルを見つけられません」となってしまい実行することができない。

原因

原因は以下の2つである。

原因1: クラスはFQCNで指定しなければならない

javacコマンドはソースファイル名を指定するにも関わらず、javaコマンドはクラス名(FQCN)を指定する必要がある。

原因2: クラスパスを検索しても指定したクラスが見つからない

パッケージに合わせたディレクトリ階層にする必要がある。

解決方法

原因1の解決方法

javaコマンド実行時はMyClassではなくhoge.MyClassを指定する。

原因2の解決方法

  1. MyClass.classをhogeディレクトリに格納する。
  2. cdコマンドでhogeディレクトリが格納されているディレクトリに移動する。
    ※hogeディレクトリの中ではなく、hogeディレクトリと同じ階層

原因1と原因2をまとめると

ソースファイルがtest/hoge/MyClass.javaにある場合、

  1. cd test
  2. java hoge.MyClass

2023/6/1追記
 Java 11以降ではjava MyClass.javaのようにjavaファイルを指定して実行することが可能。
きしだ様、コメントありがとうございました。

クラスパスとは

JVMのクラスローダーは以下で指定されたクラスパスからクラスを探す。

  1. javaコマンドの-cp(または-classpath)オプションで指定されたクラスパス
  2. 環境変数で指定されたクラスパス
  3. カレントディレクトリ(-cpオプションなしの場合)

クラスパスは以下の2種類を指定できる。

  1. ディレクトリの場所
  2. クラスファイルが入ったjarファイルやzipファイル

:(半角コロン)区切りで複数指定することができる。windowsの場合は半角セミコロン区切りとなる。
/var/javadev:/var/javadev/jars/calcapp.jar

まとめ

  1. クラスパスで指定された場所にパッケージ階層に合わせたディレクトリ階層を作成し、その中にクラスファイルを配置。
  2. -cpでクラスパスを指定、またはクラスパスで指定したディレクトリに移動にしてからFQCNでjavaコマンドを実行する。

コメント

  1. きしだ より:

    MyClass.javaがファイルひとつだけで完結している場合に一番楽な解決方法は
    > java MyClass.java
    としてjavaファイルを直接javaコマンドで実行することです。Java 11以降で対応しています。

    • 管理者 より:

      きしだ様

      コメントありがとうございます。
      記事内に追記させていただきます。