2009-07-15 3 views
3

라이브러리의 인터페이스에서 한 메소드의 리턴 유형을 변경했습니다. 이전에는 void 였고 객체를 반환하도록 수정했습니다. 반환 된 객체 (다른 모듈 용)를 사용하고 싶지 않았기 때문에 모듈에서 코드를 변경하지 않았습니다. 새로운 라이브러리 jar로 모듈을 컴파일하고 실행 한 단위 테스트를 실행했지만 푸시했을 때 실행했습니다. 라이브러리 항아리와 함께 jar 파일을 만들고 모듈을 실행하면 인터페이스에서 변경된 메소드에 대해 java.lang.NoSuchMethodError가 발생합니다. 인터페이스와 구현을 수정했습니다. 둘 다 라이브러리 jar에 있으며 스프링 주석을 사용하여 모듈에 구현 객체를 삽입합니다. 이 문제의 가능한 원인은 무엇입니까?메소드의 리턴 유형 변경은 java.lang.NoSuchMethodError를 제공합니다.

답변

6

모든 것을 다시 컴파일하지 않았거나 모든 재 컴파일 된 jar 파일을 밀어 넣지 않은 것처럼 들립니다.

또한 서버를 다시 시작했는지 여부를 지정하지 않았습니다. 일종의 "핫 리 스타트 (hot restart)"가 진행된다면 모든 클래스 로더를 매우 조심스럽게 구성해야만 올바른 결과를 얻을 수 있습니다. 컨테이너를 완전히 다시 시작할 수 있다면 도움이 될 것입니다.

0

예전의 메소드 서명이 여전히 어딘가에 매달려있는 것처럼 보이는 것처럼 프로덕션 전개 환경을 지우지 않았습니까?

0

우리는 항상 프로덕션 (및 QA) 빌드 프로세스를 구성하여 모든 클래스를 지우고 이와 같은 문제로 인해 정확하게 다시 컴파일합니다. 때때로 컴파일러 종속성 발견법은 잘못되었습니다 (특히 컴파일러가 전체 종속성을 최적화하는 상수로 정의 된 정적 최종 필드가있는 경우).

이 경우 메서드를 사용하는 코드가 변경되지 않았지만 (실제로 변경되지 않았기 때문에) 컴파일 된 바이트 코드가 올바른 메서드 서명으로 해석되지 않고 찾고자하는 것을 찾을 수 없습니다. 바이트 코드 레벨에는 JVM이 찾고있는 리턴 유형에 대한 참조가 있습니다.

0

void은 다른 유형의 하위 유형이 아닙니다. 따라서 void 유형을 반환하도록 인터페이스를 변경하면 void을 반환하는 구현 클래스는 더 이상이 메소드와 호환되지 않습니다.

5

Java 바이트 코드에서 메소드의 리턴 유형은 메소드 서명의 일부이며 동일한 이름과 동일한 매개 변수 (Java 언어에서는 수행 할 수없는) 인 두 메소드를 구별합니다. 따라서이 메소드를 호출하는 코드는 다시 컴파일되지 않았고 여전히 void를 반환하는 메소드를 호출하려고합니다.

관련 문제