문제

나는 점점 NoSuchMethodError Java 프로그램을 실행할 때 오류가 발생했습니다.무엇이 문제이며 어떻게 해결합니까?

도움이 되었습니까?

해결책

더 이상의 정보가 없으면 문제를 정확히 찾아내기는 어렵지만 근본 원인은 실행할 때 사용하는 메서드가 아닌 메서드가 누락된 다른 버전의 클래스에 대해 클래스를 컴파일했을 가능성이 높다는 것입니다.

스택 트레이스를 보세요..라이브러리의 개체에 대한 메서드를 호출할 때 예외가 나타나면 컴파일하고 실행할 때 별도의 라이브러리 버전을 사용하고 있을 가능성이 높습니다.두 곳 모두 올바른 버전이 있는지 확인하세요.

클래스에 의해 인스턴스화된 객체에 대해 메서드를 호출할 때 예외가 나타나는 경우 그러면 빌드 프로세스에 결함이 있는 것 같습니다.컴파일할 때 실제로 실행 중인 클래스 파일이 업데이트되는지 확인하세요.

다른 팁

나는 당신의 문제를 겪고 있었고 이것이 내가 해결한 방법입니다.다음 단계는 라이브러리를 추가하는 작업 방법입니다.처음 두 단계는 올바르게 수행했지만 파일 시스템에서 직접 ".jar" 파일을 Eclipse 프로젝트의 "lib" 폴더로 드래그하여 마지막 단계를 수행하지 않았습니다.또한 빌드 경로와 "lib" 폴더 모두에서 이전 버전의 라이브러리를 제거해야 했습니다.

1단계 - 빌드 경로에 .jar 추가

enter image description here

2단계 - 소스와 javadoc 연결(선택 사항)

enter image description here

3단계 - 실제로 .jar 파일을 "lib" 폴더로 드래그합니다(선택 사항 아님).

enter image description here

반사의 경우에는 NoSuchMethodException, 비반사 코드를 사용하면 다음과 같은 이점을 얻을 수 있습니다. NoSuchMethodError.나는 하나와 다른 하나에 직면할 때 매우 다른 장소를 찾는 경향이 있습니다.

JVM 매개변수를 변경할 수 있는 액세스 권한이 있는 경우 자세한 출력을 추가하면 어떤 JAR에서 어떤 클래스가 로드되고 있는지 확인할 수 있습니다.

java -verbose:class <other args>

프로그램이 실행되면 JVM은 다음과 같은 표준 출력 정보를 덤프해야 합니다.

...

[파일에서 junit.framework.Assert 로드:/C:/Program%20Files/junit3.8.2/junit.jar]

...

이는 일반적으로 다음과 같은 빌드 시스템을 사용할 때 발생합니다. 아파치 앤트 Java 파일이 클래스 파일보다 최신인 경우에만 Java 파일을 컴파일합니다.메소드 서명이 변경되고 클래스가 이전 버전을 사용하는 경우 항목이 올바르게 컴파일되지 않을 수 있습니다.일반적인 수정 방법은 전체 재구축을 수행하는 것입니다(보통 "ant clean" 다음 "ant").

때로는 한 라이브러리 버전에 대해 컴파일하지만 다른 버전에 대해 실행하는 경우에도 이 문제가 발생할 수 있습니다.

사용하는 경우 메이븐 또는 다른 프레임워크를 사용하는 경우 이 오류가 거의 무작위로 발생합니다. 다음과 같이 새로 설치해 보세요.

clean install

이는 특히 개체를 작성했고 해당 개체에 메서드가 있다는 것을 알고 있는 경우에 작동할 가능성이 높습니다.나를 위해 일했습니다.

이는 리플렉션을 사용한 결과일 수도 있습니다.클래스를 반영하고 이름으로 메서드를 추출하는 코드가 있는 경우(예:~와 함께 Class.getDeclaredMethod("someMethodName", .....)) 그러면 리팩터링 중과 같이 메서드 이름이 변경될 때마다 새 메서드 서명과 일치하도록 리플렉션 메서드에 대한 매개 변수를 업데이트해야 합니다. getDeclaredMethod 호출하면 NoSuchMethodException.

이것이 이유라면 스택 추적은 리플렉션 메서드가 호출되는 지점을 표시해야 하며 실제 메서드 서명과 일치하도록 매개 변수를 업데이트하면 됩니다.

내 경험상 프라이빗 메서드/필드를 단위 테스트하고 TestUtilities 테스트 검증을 위해 필드를 추출하는 클래스입니다.(일반적으로 단위 테스트를 염두에 두고 설계되지 않은 레거시 코드를 사용합니다.)

웹앱을 작성하는 경우 컨테이너의 전역 라이브러리 디렉터리와 앱에 충돌하는 jar 버전이 없는지 확인하세요.클래스로더가 어떤 jar을 사용하고 있는지 반드시 알 수는 없습니다.

예를 들어

  • 톰캣/공통/lib
  • mywebapp/WEB-INF/lib

이러한 문제는 동일한 두 클래스에서 동일한 개체를 사용함으로써 발생합니다.사용된 개체에는 새 개체 클래스에 포함된 새 메서드가 추가되었습니다.

전:

filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) ) 
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
        at gateway.smpp.USSDClient.bind(USSDClient.java:139)
        at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
        at gateway.USSDGW.<init>(USSDGW.java:184)
        at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)

-bash-3.00$ 

이러한 문제는 수반되는 02 유사한 클래스(src에 1개, 여기서 jar 파일에 1개는 Gateway.jar임)로 인해 발생합니다.

이는 해당 메소드가 클래스에 존재하지 않음을 의미합니다.

  1. jar를 사용하는 경우 디컴파일하고 해당 jar 버전에 적절한 클래스가 있는지 확인하세요.
  2. 소스에서 적절한 클래스를 컴파일했는지 확인하세요.

저에게는 함수의 인수 유형을 Object a에서 String a로 변경했기 때문에 이런 일이 일어났습니다.깨끗이 해결하고 다시 빌드할 수 있었습니다.

Eclipse를 다시 시작하고 applcation을 실행하여 이 오류를 해결했습니다.제 경우의 이유는 프로젝트나 Eclipse를 닫지 않고 소스 파일을 교체했기 때문일 수 있습니다.내가 사용하고 있던 클래스의 버전이 달라졌습니다.

다음 방법을 시도해 보세요.프로젝트 디렉터리(및 모든 하위 디렉터리) 아래의 모든 .class 파일을 제거합니다.재구축.

때때로 mvn clean (maven을 사용하는 경우) 수동으로 생성된 .class 파일을 정리하지 않습니다. javac.그리고 이러한 오래된 파일에는 오래된 서명이 포함되어 있어 NoSuchMethodError.

기존 답변에 추가하기만 하면 됩니다.나는 Eclipse에서 Tomcat으로 이 문제에 직면했습니다.나는 한 수업을 변경하고 다음 단계를 수행했습니다.

  1. Eclipse에서 프로젝트를 정리하고 빌드했습니다.

  2. mvn 새로 설치

  3. 톰캣을 다시 시작했습니다.

아직도 나는 같은 오류에 직면했습니다.그 다음에 Tomcat을 청소하고 Tomcat 작업 디렉토리를 청소했습니다. 서버를 다시 시작했는데 문제가 사라졌습니다.이것이 누군가에게 도움이 되기를 바랍니다

Junit 테스트 파일의 이름을 바꾸어 Eclipse에서 이 문제를 해결했습니다.
내 Eclipse 작업 공간에는 App 프로젝트와 Test 프로젝트가 있습니다.
테스트 프로젝트에는 빌드 경로의 필수 프로젝트로 앱 프로젝트가 있습니다.

NoSuchMethodError가 발생하기 시작했습니다.
그러다가 테스트 프로젝트의 클래스 이름이 앱 프로젝트의 클래스 이름과 동일하다는 것을 깨달았습니다.

App/  
  src/
     com.example/  
       Projection.java
Test/  
  src/
     com.example/
       Projection.java

테스트 이름을 올바른 이름 "ProjectionTest.java"로 바꾼 후 예외가 사라졌습니다.

내 응용 프로그램에서 메서드 서명을 변경할 때 비슷한 문제가 발생했습니다.프로젝트를 정리하고 다시 빌드하면 "NoSuchMethodError"가 해결되었습니다.

위의 답변은 매우 잘 설명합니다 .. Eclipse를 사용하는 경우 Ctrl+Shift+T를 사용하고 클래스의 패키지 구조를 입력하는 경우 한 가지 추가하십시오 (예 ::Gateway.smpp.PDUEventListener ), 존재하는 모든 jar/프로젝트를 찾을 수 있습니다.클래스 경로에서 불필요한 jar를 제거하거나 클래스 경로에 위 항목을 추가하세요.이제 올바른 것을 선택합니다.

비슷한 문제가 발생했습니다.

Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I

마침내 근본 원인이 변수의 데이터 유형을 변경하는 것임을 확인했습니다.

  1. Employee.java --> 변수를 포함합니다(EmpId)의 데이터 유형이 다음에서 변경되었습니다. int 에게 String.
  2. ReportGeneration.java --> getter를 사용하여 값을 검색합니다. getEmpId().

수정된 클래스만 포함하여 jar를 다시 번들링해야 합니다.아무런 변화가 없었기 때문에 ReportGeneration.java 나는 단지 Employee.class Jar 파일에.나는 ReportGeneration.class 문제를 해결하려면 항아리에 파일을 넣으세요.

나는 같은 문제를 겪었습니다.이는 수업에 모호함이 있는 경우에도 발생합니다.내 프로그램이 동일한 위치/클래스 경로에 있는 두 개의 JAR 파일에 있는 메서드를 호출하려고 했습니다.하나의 JAR 파일을 삭제하거나 하나의 JAR 파일만 사용되도록 코드를 실행하세요.동일한 클래스를 포함하는 동일한 JAR 또는 동일한 JAR의 다른 버전을 사용하고 있지 않은지 확인하십시오.

DISP_E_EXCEPTION [단계] [] [Z-JAVA-105 Java 예외 java.lang.NoSuchMethodError(com.example.yourmethod)]

원래 질문에 대답하려면.자바 문서에 따르면 여기:

"NoSuchMethodError" 응용 프로그램이 클래스(정적 또는 인스턴스)의 지정된 메서드를 호출하려고 시도하고 해당 클래스에 더 이상 해당 메서드에 대한 정의가 없는 경우 발생합니다.

일반적으로 이 오류는 컴파일러에 의해 포착됩니다.이 오류는 클래스 정의가 호환되지 않게 변경된 경우 런타임에만 발생할 수 있습니다.

  1. 런타임 중에 발생하는 경우 메서드가 포함된 클래스가 클래스 경로에 있는지 확인하세요.
  2. 새 버전의 JAR을 추가했는지, 메소드가 호환되는지 확인하세요.

대부분의 경우 java.lang.NoSuchMethodError는 컴파일러에서 발생하지만 때로는 런타임에 발생할 수도 있습니다.이 오류가 런타임에 발생하는 경우 유일한 이유는 클래스 구조가 변경되어 호환되지 않기 때문일 수 있습니다.

최선의 설명: https://www.journaldev.com/14538/java-lang-nosuchmethoderror

저도 이 오류를 겪었습니다.

내 문제는 메소드의 서명을 다음과 같이 변경했다는 것입니다.

void invest(Currency money){...}

~ 안으로

void invest(Euro money){...}

이 메소드는 다음과 유사한 컨텍스트에서 호출되었습니다.

public static void main(String args[]) {
    Bank myBank = new Bank();

    Euro capital = new Euro();
    myBank.invest(capital);
}

자본금은 통화이자 유로이기 때문에 컴파일러는 경고/오류에 대해 침묵했습니다.

문제는 메소드가 정의된 클래스(Bank)만 컴파일했지만 main() 메소드를 포함하는 메소드가 호출되는 클래스는 컴파일하지 않았기 때문에 나타났습니다.

이 문제는 너무 자주 발생할 수 있는 문제가 아닙니다. 대부분의 경우 수정된 클래스를 컴파일하는 대신 프로젝트가 수동으로 다시 빌드되거나 빌드 작업이 자동으로 트리거되기 때문입니다.

내 사용 사례는 수정되지 않았기 때문에 App.class를 포함하지 않는 핫픽스로 사용될 .jar 파일을 생성했다는 것입니다.상속을 통해 초기 인수의 기본 클래스를 유지했기 때문에 이를 포함하지 않는 것이 합리적이었습니다.

문제는 클래스를 컴파일할 때 결과 바이트코드가 다음과 같다는 것입니다. 공전, 즉, 그것은 하드 참조.

javap 도구를 사용하여 생성된 원본 디스어셈블된 바이트코드는 다음과 같습니다.

 #7 = Methodref          #2.#22         // Bank.invest:(LCurrency;)V

ClassLoader가 새로 컴파일된 Bank.class를 로드한 후에는 해당 메소드를 찾지 못하고 제거되었지만 변경되지 않은 것처럼 나타나므로 오류라는 이름이 붙었습니다.

도움이 되었기를 바랍니다.

제 경우의 문제는 빌드 경로에 동일한 라이브러리의 두 버전이 있다는 것이었습니다.이전 버전의 라이브러리에는 해당 기능이 없었고 최신 버전에는 있었습니다.

Intelij를 사용하는 Gradle 프로젝트에서도 비슷한 문제가 발생했습니다..gradle(아래 스크린샷 참조) 패키지를 삭제하고 프로젝트를 다시 빌드하여 문제를 해결했습니다..gradle 패키지

NoSuchMethodError:나는 이 문제를 해결하는 데 몇 시간을 보냈고 마침내 패키지 이름을 바꾸고 정리하고 빌드하여 문제를 해결했습니다.작동하지 않으면 먼저 클린 빌드를 시도해 보세요. 클래스 이름이나 패키지 이름을 바꾸고 클린 빌드를 시도해 보세요. 문제가 해결되어야 합니다.행운을 빌어요.

나는 같은 오류가 발생했습니다 :

  Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V
        at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
        at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
        at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
        at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)

이를 해결하기 위해 먼저 확인했습니다. 모듈 종속성 다이어그램 (click in your POM the combination -> Ctrl+Alt+Shift+U 또는 right click in your POM -> Maven -> Show dependencies) 라이브러리 간의 충돌이 정확히 어디에서 발생했는지 이해합니다(Intelij IDEA).내 특별한 경우에는 다른 버전의 Jackson 종속성이 있었습니다.

enter image description here enter image description here

1) 그래서 저는 프로젝트의 POM에 명시적으로 이 두 버전 중 가장 높은 버전인 2.8.7을 직접 추가했습니다.

속성에서:

<jackson.version>2.8.7</jackson.version>

그리고 의존성으로는:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

2) 그러나 다음을 사용하여 해결할 수도 있습니다. 종속성 제외.

아래 예와 동일한 원리로:

  <dependency>
      <groupId>group-a</groupId>
      <artifactId>artifact-a</artifactId>
      <version>1.0</version>
          <exclusions>
             <exclusion>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
             </exclusion>
         </exclusions>
  </dependency>

원치 않는 버전에 대한 종속성은 프로젝트에서 제외됩니다.

파일 이름이 기본 메소드를 포함하는 클래스 이름과 다른 경우 이 오류가 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top