事象
まず以下のようなChild
クラスが存在するとします。
Child.java
public class Child extends Parent {
public static void main(String[] args) {
System.out.println("This class is `Child`");
}
}
これをchild.jar
に格納し、Java8で実行した結果が次の通りになります。
C:\>java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
C:\>java -cp child.jar Child
エラー: メイン・クラスChildが見つからなかったかロードできませんでした
Child
クラスは確かに存在するにも関わらず「メイン・クラスChildが見つからなかったかロードできませんでした」というエラーによりJavaの実行が失敗しました。
原因
__真因はChild
の親クラスParent
が読み込めていないためになります。__実はParent
はchild.jar
とは別のparent.jar
に格納されています。しかし上記のjava
コマンド実行方法では、parent.jar
が読み込めていません。
そこでparent.jar
もクラスパスに加えて、java
を実行してやると、想定通り動作しました。
C:\>java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
C:\>java -cp child.jar;parent.jar Child
This class is `Child`
「Childが見つからない」という部分だけを見ると、Child
が正しくchild.jar
に格納できていないように思えますし、実際筆者はこの思いこみのせいでずいぶんと時間を無駄にしました……。エラーメッセージが分かりにくいのが悪いんや(逆ギレ)