본문 바로가기
java

[Java] Handler dispatch failed; nested exception is java.lang.NoSuchFieldError:

by moonsiri 2022. 7. 21.
728x90
반응형
public class NoSuchFieldError
extends IncompatibleClassChangeError
Thrown if an application tries to access or modify a specified field of an object, and that object no longer has that field.

Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.

Since: JDK1.0

 

NoSuchFieldError는 보통 해당 객체에 해당 필드가 더 이상 없는 경우 throw 됩니다.

일반적으로 이 오류는 컴파일러에 의해 catch 되는데, 클래스의 정의가 호환되지 않게 변경된 경우 Runtime 시 발생합니다.

 

 

예를 들어 common-date dependency의 0.0.1 버전에서 joda를 사용 중이었다가

import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class ConstantsDate {
	public static final DateTimeFormatter FMTR_YMD = DateTimeFormat.forPattern("yyyyMMdd");
}

0.0.2 버전에서 joda를 걷어내고 java time을 사용하게 되었다고 가정해보겠습니다.

import java.time.format.DateTimeFormatter;

public class ConstantsDate {
	public static final DateTimeFormatter FMTR_YMD = DateTimeFormatter.ofPattern("yyyyMMdd");
}

 

그리고 common-date-utils라는 모듈이 common-date 0.0.1 버전을 dependency 하여 ConstantsDate.FMTR_YMD를 사용하고 있을 때

import org.joda.time.DateTime;

public class DateUtil {
    public static String getToday() {
        return DateTime.now().toString(FMTR_YMD);
    }
}

common-date-utils과 common-date 0.0.2 버전을 dependency 하여 사용 중인 프로젝트에서 common-date-utils의 DateUtil. getToday()를 호출하면 NoSuchFieldError:FMTR_YMD 오류가 발생하게 됩니다.

 

혹은 중복으로 라이브러리를 디팬던시한 경우 발생합니다.

<dependency>
    <groupId>com.moonsiri.date</groupId>
    <artifactId>common-date</artifactId>
    <version>0.0.1</version>
</dependency>

<dependency>
    <groupId>com.moonsiri.date</groupId>
    <artifactId>common-date</artifactId>
    <version>0.0.2</version>
</dependency>
728x90
반응형

댓글