1. 개요

이 기사에서는 NoSuchFieldError 의 원인을 보여주고 해결 방법을 알아보겠습니다.

2. NoSuchField 오류

이름에서 알 수 있듯이 NoSuchFieldError 는 지정된 필드가 없을 때 발생합니다. NoSuchFieldErrorIncompatibleClassChangeError 클래스를 확장하고 응용 프로그램이 개체의 필드 또는 클래스의 정적 필드에 액세스하거나 수정하려고 시도하지만 개체 또는 클래스에 더 이상 해당 필드가 없을 때 throw 됩니다 .

IncompatibleClassChangeError  클래스는 LinkageError 클래스를 확장하고 호환되지 않는 클래스 정의 변경을 수행할 때 발생합니다. 마지막으로 LinkageErrorError를 확장 하고 클래스가 호환되지 않고 변경된 다른 클래스에 대한 의존성을 가지고 있음을 보여줍니다.

예제를 통해 이 오류가 실제로 작동하는지 살펴보겠습니다. 첫 번째 단계로 Dependency 클래스를 생성해 보겠습니다 .

public class Dependency {
    public static String message = "Hello Baeldung!!";
}

그런 다음 Dependency 클래스 의 필드를 참조 하는 FieldErrorExample 클래스를 만듭니다 .

public class FieldErrorExample {
    public static String getDependentMessage() {
        return Dependency.message;
    }
}

Dependency  클래스 에서 메시지받는지 확인하는 코드도 추가해 보겠습니다 .

public static void fetchAndPrint() {
    System.out.println(getDependentMessage());
}

이제 javac 명령을 사용하여 이러한 파일을 컴파일할 수 있으며 , java 명령을 사용하여 FieldErrorExample 클래스를 실행 하면 지정된 메시지 가 인쇄됩니다 .

그러나 Dependency  클래스 에서 속성 이름을 어노테이션 처리, 제거 또는 변경 하고 다시 컴파일하면 오류가 발생 합니다.

예를 들어 Dependency  클래스 에서 속성 이름을 변경해 보겠습니다 .

public class Dependency {
    public static String msg = "Hello Baeldung!!";
}

우리는 우리의 컴파일 지금, 만약 종속  클래스를 , 다음 실행 FieldErrorExample을 다시, 우리는 발생할 수 있습니다 NoSuchFieldError를 :

Exception in thread "main" java.lang.NoSuchFieldError: message

때문에 위의 오류가 발생하지 FieldErrorExample 클래스는 여전히 정적 필드를 참조 메시지의존성 클래스하지만 더 이상 존재 - 우리는에 호환되지 않는 변경했습니다 종속 클래스를.

3. 오류 해결

이 오류를 방지하려면 기존 파일정리하고 컴파일 해야 합니다 . javac 명령을 사용하거나 mvn clean install 을 실행하여 Maven 에서 이 작업을 수행할 수 있습니다 . 이 단계를 수행하면 최신 컴파일된 파일이 모두 생성되고 오류가 발생하지 않습니다.

오류가 지속되면 문제는 여러 JAR 파일일 수 있습니다. 하나는 컴파일 중이고 다른 하나는 실행 중입니다. 이것은 애플리케이션이 외부 JAR에 의존할 때 자주 발생합니다. 여기 에서 일관성 없는 JAR을 식별하기 위해 빌드 경로에서 JAR의 순서를 검증 해야 합니다 .

더 조사해야 하는 경우 -verbose: class 옵션 을 사용 하여 애플리케이션 실행 하여 로드된 클래스를 확인하는 것이 좋습니다. 이것은 우리가 오래된 클래스를 식별하는 데 도움이 될 수 있습니다.

때때로 타사 JAR이 내부적으로 다른 버전을 참조하고 있을 수 있으며, 이로 인해 NoSuchFieldError 가 발생 합니다. 이런 일이 발생하면 mvn dependency:tree -Dverbose를 사용할 수 있습니다 . 이것은 maven 의존성 트리를 생성하고 일관성 없는 JAR을 식별하는 데 도움이 됩니다.

4. 결론

이 짧은 사용방법(예제)에서는 NoSuchFieldError 가 발생하는 이유 와 해결 방법을 살펴보았습니다.

항상 그렇듯이 코드는 GitHub 에서 사용할 수 있습니다 .

Junit footer banner