sourcecode

No Such Method Error 수정 방법

copyscript 2022. 7. 30. 18:16
반응형

No Such Method Error 수정 방법

NoSuchMethodErrorJava java java java java java java java java java java java java java java java.무엇이 문제이며 어떻게 수정해야 합니까?

더 이상의 정보가 없으면 문제를 특정하기 어렵지만 근본 원인은 메서드가 없는 클래스의 다른 버전에 대해 클래스를 컴파일했을 가능성이 높기 때문입니다.실행할 때 사용하고 있는 버전과 다릅니다.

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

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

난 네 문제를 안고 있었고, 이렇게 해결했어라이브러리를 추가하는 방법은 다음과 같습니다.처음 두 단계는 제대로 수행했지만 파일 시스템에서 직접 ".jar" 파일을 제 이클립스 프로젝트의 "lib" 폴더로 끌어다 놓음으로써 마지막 단계는 수행하지 못했습니다.또한 빌드 경로와 "lib" 폴더 모두에서 이전 버전의 라이브러리를 삭제해야 했습니다.

스텝 1 - 빌드 경로에 .jar 추가

여기에 이미지 설명 입력

스텝 2 - 소스 및 자바독 관련지어(옵션)

여기에 이미지 설명 입력

스텝 3 - 실제로 .jar 파일을 "lib" 폴더로 드래그합니다(옵션 아님).

여기에 이미지 설명 입력

'반성하다', '반성하다', '반성하다'가 .NoSuchMethodException코드일 「」가 됩니다.NoSuchMethodError나는 다른 사람과 마주할 때 매우 다른 곳을 찾는 경향이 있다.

JVM 파라미터를 변경할 수 있는 경우 상세 출력을 추가하면 어떤 클래스가 어떤 JAR 파일에서 로드되고 있는지 알 수 있습니다.

java -verbose:class <other args>

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

...

[junit.framework 로딩 완료]파일:/C:/Program%20Files/junit3.8.2/junit.jar]

...

Maven 또는 다른 프레임워크를 사용하여 거의 랜덤으로 이 오류가 발생할 경우 다음과 같은 클린 설치를 시도합니다.

clean install

오브젝트를 작성하고 메서드가 있는 것을 알고 있는 경우, 이것은 특히 효과가 있을 가능성이 있습니다.

이는 보통 Java 파일이 클래스 파일보다 최신일 때만 Java 파일을 컴파일하는 Apache Ant와 같은 빌드 시스템을 사용할 때 발생합니다.메서드 시그니처가 변경되어 클래스가 이전 버전을 사용하고 있는 경우, 올바르게 컴파일되지 않을 수 있습니다.통상적인 수정은 완전한 재구축(보통 "개미 청소" 후 "개미")을 실행하는 것입니다.

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

같은 에러가 발생했습니다.

  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)

이를 해결하기 위해 먼저 모듈 의존도(Module Dependency Diagram)를 확인했습니다.click in your POM the combination -> Ctrl+Alt+Shift+U ★★★★★★★★★★★★★★★★★」right click in your POM -> Maven -> Show dependencies인텔리제 IDEA(Intelij IDEA)를 사용합니다.내 경우엔, 잭슨의 의존관계 버전이 달랐어.

여기에 이미지 설명 입력 여기에 이미지 설명 입력

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>

원하지 않는 버전과의 종속성은 프로젝트에서 제외됩니다.

이것은 반사를 사용한 결과일 수도 있습니다. "with" "with" "with" )Class.getDeclaredMethod("someMethodName", .....))의 경우 중 등변경될 "Decause"와 getDeclaredMethodNoSuchMethodException.

이것이 원인일 경우 스택트레이스에 리플렉션 방식이 호출된 포인트가 표시됩니다.실제 메서드시그니처와 일치하도록 파라미터를 갱신하기만 하면 됩니다.

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

이 문제는 함수에서 인수 유형을 개체a에서 문자열a로 변경했기 때문에 발생합니다.깔끔하게 해결하고 다시 구축할 수 있었다.

웹 앱을 작성하는 경우 컨테이너의 글로벌 라이브러리 디렉터리 및 앱에 충돌하는 버전의 jar가 없는지 확인하십시오.클래스 로더에 의해 어떤 항아리가 사용되고 있는지 반드시 알 필요는 없습니다.

예.

  • Tomcat/common/lib
  • mywebapp/WEB-INF/lib

제 경우 멀티 모듈프로젝트가 있었는데 시나리오가 다음과 같았습니다.com.xyz.TestClass 안에 .A에서도 마찬가지입니다.B 모듈 " " "A했습니다.B.가 없는 경우 중 그래서 어셈블리 항아리를 만드는 동안 호출된 메서드가 없으면 클래스의 한 버전만 유지되었다고 생각합니다.NoSuchMethodError런타임 예외이지만 컴파일은 문제없었습니다.

관련 : https://reflectoring.io/nosuchmethod/

즉, 각 메서드는 클래스에 존재하지 않습니다.

  1. jar를 사용하는 경우 디컴파일하여 각 버전의 jar에 적절한 클래스가 있는지 확인합니다.
  2. 소스로부터 적절한 클래스를 컴파일했는지 확인합니다.

이클립스를재시작하여어플리케이션을실행함으로써이오류를해결했습니다.이 경우 프로젝트나 이클립스를 닫지 않고 소스 파일을 바꾸기 때문일 수 있습니다.그래서 내가 쓰던 수업의 버전이 달라졌어

이 방법을 사용해 보십시오.프로젝트 디렉토리의 모든 .class 파일(물론 모든 서브 디렉토리)을 삭제합니다.재구축.

★★★★★★★★★★★★★★★★★.mvn clean을 사용하고 경우)는 (maven's 'maven's 'mavenclass.class'에 의해 수동으로 작성된 .청소하지 .javac시그니처가 되어 있기 「」로 됩니다.NoSuchMethodError.

기존 답변에 추가할 뿐입니다.나는 일식 속의 Tomcat에 대해 이 문제에 직면해 있었다.저는 한 반을 바꾸고 다음 단계를 밟았습니다.

  1. 프로젝트를 청소하고 eclpise로 구축했습니다.

  2. mvn 클린 설치

  3. 재시작된 Tomcat

여전히 나는 같은 오류에 직면해 있었다.그런 다음 Tomcat을 청소하고 Tomcat 작업 디렉토리를 청소하고 서버를 재시작하면 문제가 사라집니다.이게 도움이 됐으면 좋겠는데

이러한 문제는 동일한 개체를 동일한 두 클래스에서 사용하기 때문에 발생합니다.사용된 개체에 새 개체 클래스에 포함된 새 메서드가 추가되지 않았습니다.

예:

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)에 의해 발생합니다.

첫 번째 질문에 답하기 위해서.java 문서에 따르면 다음과 같습니다.

"NoSuchMethodError" 응용 프로그램이 클래스의 지정된 메서드(스태틱 또는 인스턴스)를 호출하려고 할 때 해당 클래스에 해당 메서드의 정의가 없어지면 느려집니다.

보통 이 오류는 컴파일러에 의해 검출됩니다.이 오류는 클래스의 정의가 호환되지 않는 경우에만 런타임에 발생합니다.

  1. 런타임에 발생할 경우 메서드가 포함된 클래스가 클래스 경로에 있는지 확인합니다.
  2. 새 버전의 JAR을 추가했으며 메서드가 호환되는지 확인합니다.

Junit 테스트 파일의 이름을 변경하여 이클립스에서 이 문제를 해결했습니다.
이클립스 작업 공간에는 앱 프로젝트와 테스트 프로젝트가 있습니다.
테스트 프로젝트에는 빌드 경로에 App 프로젝트가 필수 프로젝트로 있습니다.

No Such Method Error(그런 메서드 오류 없음)
그리고 테스트 프로젝트의 클래스가 앱 프로젝트의 클래스와 이름이 같다는 것을 알게 되었습니다.

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

테스트 이름을 ProjectionTest.java라는 올바른 이름으로 변경하면 예외가 사라집니다.

No Such Method Error : 이 문제를 수정하는 데 몇 시간이 걸렸는데 패키지 이름, 정리 및 빌드 이름만 바꾸면 문제가 해결되었습니다.먼저 클린 빌드를 시도해도 문제가 해결되지 않으면 클래스 이름 또는 패키지 이름을 변경하고 클린 빌드... 수정해야 합니다.행운을 빌어요.

왜 아무도 의존성 갈등에 대해 언급하지 않는 거죠?이 일반적인 문제는 버전이 다른 종속성 자리와 관련이 있을 수 있습니다.상세설명 및 솔루션: https://dzone.com/articles/solving-dependency-conflicts-in-maven

간단한 답변

이 maven 의존관계를 추가합니다.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
    <rules>
        <dependencyConvergence />
    </rules>
</configuration>
</plugin>

그런 다음 이 명령을 실행합니다.

mvn enforcer:enforce

어쩌면 이것이 당신이 직면한 문제의 원인일지도 모릅니다.

어플리케이션의 메서드 시그니처를 변경할 때도 같은 문제가 발생하였습니다.프로젝트를 청소하고 재구축하면 "No Such Method Error"가 해결되었습니다.

위의 답변은 매우 잘 설명되어 있습니다.한 가지만 더하기 위해 이클립스를 사용하는 경우 ctrl+shift를 사용합니다.+T를 입력하고 클래스의 패키지 구조(예: gateway.smpp)를 입력합니다.PDUvent Listener )가 존재하는 모든 항아리/프로젝트를 찾을 수 있습니다.클래스 경로에서 불필요한 jar를 제거하거나 클래스 경로에 위의 jar를 추가합니다.이제 올바른 것을 선택할 수 있습니다.

저도 비슷한 문제에 부딪혔어요.

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

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

  1. Employee.java-->되어 있습니다(--> --(((((((((((((( -- 。EmpId이 「」에서 int로로 합니다.String.
  2. ReportGeneration.java--> --> getter를 하여 값을 getEmpId().

우리는 수정된 클래스만 포함시킴으로써 그 항아리를 다시 넣기로 되어 있다.ReportGeneration.java는 단지 '아까부터'를 포함시키고 있었다.Employee.class일일 jar jar jar jar.는 어쩔 수 이 문구를 했다.ReportGeneration.class문제를 해결하기 위해 항아리에 파일을 넣습니다.

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

DISP_E_EXCEPTION [스텝][] [Z-JAVA-105 Java 예외 java.lang ]No Such Method Error(com.example).방법)]

대부분의 경우 java.lang.No Such Method Error는 컴파일러에서 검출되지만 실행 시 발생할 수 있습니다.런타임에 이 오류가 발생할 경우 클래스 구조가 변경되어 호환되지 않을 수 있습니다.

베스트 설명 : 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);
}

이 컴파일러는 경고/오류에 대해 침묵을 지켰습니다.캐피털은 통화이기도 하고 유로이기도 하기 때문입니다.

main() 메서드를 포함한 메서드의 호출원 클래스가 아닌 메서드가 정의된 클래스인 뱅크만 컴파일했기 때문에 문제가 발생하였습니다.

이 문제는 프로젝트를 수동으로 재구축하거나 수정된 클래스를 컴파일하는 대신 빌드 액션이 자동으로 트리거되는 경우가 대부분이기 때문에 자주 발생하는 문제가 아닙니다.

저의 유스케이스는 핫픽스로 사용하는 .jar 파일을 생성했는데, 이 파일은 수정되지 않았기 때문에 App.class가 포함되지 않았습니다.나는 초기 주장의 기본 계급인 상속을 유지했기 때문에 그것을 포함하지 않는 것이 타당했다.

중요한 것은 클래스를 컴파일할 때 생성되는 바이트코드는 일종의 정적, 즉 하드 레퍼런스라는 것입니다.

원래 분해된 바이트 코드(javap 툴로 생성)는 다음과 같습니다.

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

ClassLoader는 새로운 컴파일된 Bank.class를 로드한 후 이러한 메서드를 찾을 수 없습니다.이 메서드는 삭제되어 변경되지 않은 것처럼 표시되므로 명명된 오류가 발생합니다.

이게 도움이 됐으면 좋겠다.

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

Intelij를 사용한 Gradle Project에서도 같은 문제가 있었습니다..gradle 패키지를 삭제하고(아래 스크린샷 참조), Project. .gradle 패키지를 재구축하여 해결했습니다.

나도 같은 문제에 직면했었다.저는 한 메서드의 반환 유형을 변경하여 해당 클래스의 테스트 코드를 실행했습니다.는 이 일에 했다.NoSuchMethodError솔루션으로서 테스트 코드를 다시 실행하기 전에 저장소 전체에서 maven build를 한 번 실행했습니다.이 문제는 다음 한 번의 테스트 실행으로 해결되었습니다.

이 에러가 발생하는 예를 다음에 나타냅니다.우연히 프라이빗 스태틱멤버 변수에 비 스태틱메서드로 액세스 하는 바보 같은 실수를 했습니다.방법을 스태틱으로 변경하면 문제가 해결.

언급URL : https://stackoverflow.com/questions/35186/how-do-i-fix-a-nosuchmethoderror

반응형