Java에서 클래스를 처음 액세스 할 때 (새 인스턴스 만들기, 정적 메서드 또는 정적 필드 호출) 알지만이 간단한 예제에서는 런타임에 내 ClassPath에없는 일부 클래스를 사용하는 jar 파일을 실행하십시오. 첫 번째 액세스에서 클래스를로드하기 때문에 예외가 발생하기 전에 정적 블록 및 main 메서드에서 내 메시지를 인쇄 할 것으로 예상됩니다. 하지만 "스레드에서 예외"메인 "java.lang.NoClassDefFoundError : com/example/DateAbstract"있어 아무 것도 인쇄되지 않습니다. 추상 클래스 또는 기본 클래스의 인터페이스를 사용하여 해당 클래스 또는 인터페이스가 다른 jar 파일에있는 경우에 발생했습니다. 내 또 다른 항아리에NoClassDefFoundError 런타임시 Class 클래스에 클래스를 추가 할 때 기본 클래스에서 abstract 나 인터페이스를 사용할 때
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());
}
}
질문 : 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?