728x90
반응형
public class NoSuchFieldError
extends IncompatibleClassChangeError
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
반응형
댓글