Frudy
7k
2019-05-27 09:58:39 작성 2019-05-27 10:14:42 수정됨
6
3125

java.lang.NoSuchMethodError가 왜 발생하는지 잘 모르겠습니다.


발생에러)

java.lang.NoSuchMethodError: myutil.string.ParameterConvert.<init>(Ljavax/servlet/http/HttpServletRequest;)V

에러메시지 맨끝에

;)V

이 V가 뭔지 모르겠습니다. 


에러메시지 적은 사람이 V라는 오타를 넣었을리가 없는대..


환경)

에러발생 프로젝트 = help (spring legacy project, spring web maven)


에러 발생라인


저는 그저.. myutil에 있는 ParameterConvert클래스의 생성자에

request를 매개값으로 넘긴것밖에 없습니다.


그전에는,

ParameterConvert.method(String value); 이렇게 static method의 메소드에 String 매개변수를 넘겨서

잘만 사용하고있었는데,


설계를 바꿔서 그냥 생성자로 request를 넘겨주었습니다.

그랬더니 저런에러가 발생합니다.


추가정보)

myutil = eclipse에서 만든 순수 자바프로젝트입니다.


찾아본내용)

"NoSuchMethodError"라고 검색헀으나 원하는 자료가없어서,

에러내용 전체를 복붙하여 검색해본결과...

잘 이해는 안가지만, 버전 호환이 안되는거같았습니다.


>>

myutil프로젝트는 순수 자바프로젝트에, 


 톰캣 라이브러리를 Build Path에 등록해서 쓰는게 전부였으며,


servlet-api 4.1.jar를 mvnrepository에서 직접 받아서

기존 myutil의 저 library를 삭제하고 servlet-api4.1.jar를 등록해봤으나,

에러내용이 동일하게 발생하였습니다.


(mvnrepository에서 servlet-api 4.1버전은 딱히 호환표가 없어서

모든 톰캣버전에 호환되는거같다고 생각합니다만...)


1. 왜 저런에러가 발생하는지, (에러메시지의 ;)V가 무슨뜻인지...)

2. 저 에러를 어떻게 해결해야할지

잘모르겠습니다.  도움부탁드립니다.

0
  • 답변 6

  • rezigrene
    1k
    2019-05-27 10:14:39

    파라메터를 HttpServletRequest로 받는 생성자가 없어서겠지요.

    패키지가 다른 클래스명만 같은것을 쓰고있다든지

  • fender
    21k
    2019-05-27 10:16:14 작성 2019-05-27 10:18:36 수정됨

    메서드 시그네쳐를 스택트레이스에 표시할 때 'V`는 반환형이 없음(void)을 뜻합니다.

    NoSuchMethodError는 보통 컴파일 시점에 있던 메서드가 런타임에 존재하지 않을 때 흔히 발생합니다. 어디엔가 해당 클래스의 서로 다른 버전이 클래스 경로에 올라가지 않았는지 확인해보시기 바랍니다.

    참고로 이런 경우에는 구글 검색보다는 우선 오류의 API 문서의 설명을 먼저 확인하시는 것이 좋습니다.

    rezigrene // 패키지가 다른 같은 이름의 클래스는 컴파일 타임이나 런타임이나 서로 다른 클래스로 인식하기 때문에 해당 문제와 관련은 없을 것 같습니다.

  • rezigrene
    1k
    2019-05-27 10:20:01 작성 2019-05-27 10:20:26 수정됨

    그럼 저기서 난오류가아니라 기존 .method() 를 쓰기위해 기본생성자로 인스턴스 생성하던게 삭제되어 그런모양이네요.

  • dsms
    851
    2019-05-27 10:23:01

    보통 중복되는 jar파일로 컨테이너가 어떤 것을 선택할지 몰라 발생하는 에러입니다.


    경로상 같은 이름의 메소드가 있는 서로다른 jar가 있는지 확인해보세요

  • fender
    21k
    2019-05-27 10:26:16 작성 2019-05-27 10:29:17 수정됨

    Frudy // 간단하게 말해서 A클래스가 B클래스의 b() 메서드를 호출하는 경우 그 상태로 컴파일을 한다음 B의 .class 파일을 복사해서 보관하고 있다가 b() 메서드를 c()로 이름을 바꾼 후 A의 참조도 같이 변경하면 컴파일이 정상적으로 됩니다.

    하지만 이 때 빌드 후 B.class를 이전 버전으로 대체한 다음에 실행하면 c()에 대한 NoSuchMethodError가 발생합니다.

    런타임 클래스 경로에 문제되는 클래스의 다른 버전이 어떻게 올라갔는지를 확인해보시면 될 것 같습니다.

  • fender
    21k
    2019-05-27 12:07:45 작성 2019-05-27 12:08:37 수정됨

    Frudy // NoSuchMethodError가 발생할 수 있는 경우에 대한 제 설명은 제대로 이해하신 것이 맞습니다. "b() 메서드를 c()로 이름을 바꾼 후"라는 건 실습하신 대로 참조까지 같이 바꾼 경우를 뜻한 것이었습니다.

    컴파일 오류가 있으면 빌드가 안되어 .class 파일이 생성될리 없으니 'B.class를 대체한다' 같은 상황이 나올 수 없겠죠.

    오류 상황은 일단 이클립스 프로젝트 설정 차원의 문제로 보입니다. 원래 라이브러리를 참조하거나 하는 것은 메이븐 등을 통해 런타임 클래스 경로에 jar 파일 등을 추가하는 것으로 동작하지만, 참조하려는 라이브러리도 같이 개발하는 경우 매번 jar 파일로 내보내고 하는 것이 귀찮기 때문에 보통 IDE 차원에서 '프로젝트' 자체를 마치 jar 파일인 것 처럼 의존성으로 관리할 수 있는 기능을 제공합니다.

    경고 메시지는 myutil에 대한 참조가 실제 라이브러리가 아닌 이클립스 차원의 프로젝트에 대한 것이기 때문에, 실제 배포를 했을 때 해당 라이브러리가 없어서 문제가 될 수 있다는 뜻입니다.

    `NoSuchMethodError`는 어쨌건 빌드시 참조한 클래스와 런타임의 클래스의 버전이 다른 것이기 때문에 그 부분에 대한 경우의 수를 파악하는 데 집중하는 것이 낫지 않을까 싶습니다.

    (글을 쓰고 보니 덧글이 지워졌네요... 참조가 될만한 내용일 수 있어 남겨 놓습니다.)

  • 로그인을 하시면 답변을 등록할 수 있습니다.