Java が最初のアクセス (新しいインスタンスの作成、静的メソッドまたは静的フィールドの呼び出し) でクラスをロードすることは知っていますが、この単純な例では、実行時に ClassPath にないいくつかのクラスを使用する jar ファイルを実行しようとしています。例外が発生する前に、(最初のアクセスでクラスをロードするため)静的ブロックとメインメソッドにメッセージを出力することを期待しています。しかし、「スレッド「メイン」の例外 java.lang.NoClassDefFoundError: com/example/DateAbstract」が表示され、何も出力されませんでした。これは、クラスまたはインターフェースが別のjarファイルにあるメインクラスで抽象クラスまたはインターフェースを使用したときに発生しました。
public class Driver {
static { System.out.println("I am first.[static block]"); }
public static void main(String[] args) {
System.out.println("I am first.[ main method]");
DateAbstract date = new CustomDate();
System.out.println(date.sayDate());
}
私の別の瓶で:
public class CustomDate extends DateAbstract {
@Override
public String sayDate() {
return new Date().toString();
}
public abstract class DateAbstract {
public abstract String sayDate();
}
このコードを使用して、実行時にクラスをクラスパスに追加すると。何も変わっていません。静的ブロックを実行する前に実行を取得しました。
public class Driver {
static {
System.out.println("I am first.[static block]");
try {
URL url = new File("lib/DateApi.jar").toURI().toURL();
URLClassLoader urlClassLoader = (URLClassLoader) URLClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(urlClassLoader,url);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println("I am first.[ main method]");
DateAbstract date = new CustomDate();
System.out.println(date.sayDate());
}
}
質問 : なぜこれが起こっているのか、どのように解決すればよいのですか?