事象
まず以下のような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に格納できていないように思えますし、実際筆者はこの思いこみのせいでずいぶんと時間を無駄にしました……。エラーメッセージが分かりにくいのが悪いんや(逆ギレ)