개발/java,spring

[자바 에러] java.lang.NoSuchMethodError, ByteBuffer.limit(I)Ljava

Mr.Lee 하루 2025. 7. 7. 09:22

이상하다.. 평소 쓰던 소스였는데...
에러가 난다. 아마 협업으로 쓰고 있기 때문에 에러가 발생할 수 있다는 생각은 들지만... 이상하다
에러를 알아 보았다.

📌 에러 메시지

심각: Servlet.service() for servlet [dispatcher] in context with path [/smart] threw exception 
[Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: 
java.nio.ByteBuffer.limit(I)Ljava/nio/ByteBuffer;] 
with root cause java.lang.NoSuchMethodError: java.nio.ByteBuffer.limit(I)Ljava/nio/ByteBuffer;

🧨 에러 원인 요약

  • java.nio.ByteBuffer.limit(int) 메서드는 Java 9 이후부터 fluent-style (리턴형: ByteBuffer) 로 변경됨.
  • Java 8에서는 limit(int) 메서드가 void 리턴이기 때문에, 체이닝 사용 시 NoSuchMethodError 발생.
  • 즉, JDK 11 이상에서 컴파일된 클래스가 Java 8에서 실행되면 오류 발생.


이상하다... 원래 몇년간 자바1.8을 계속 쓰고 있었는데 왜 에러가 나지..?

🔍 NioZipEncoding.java:105 관련

  • 이 파일은 org.apache.commons.compress.archivers.zip.NioZipEncoding 클래스.
  • Apache Commons Compress 라이브러리에서 ZIP 파일 인코딩을 처리.
  • 해당 라인에서 ByteBuffer.limit(int).position(int) 같은 체이닝 코드가 사용된 것으로 추정됨.
  • Java 8에서는 체이닝이 불가능하여 NoSuchMethodError 발생.


아파치도 그냥 계속 쓰던거였는데.. 조사해보니 톰캣 버전을 아무리 바꾼다해도
에러가 해결되지는 않는다. 자바 버전을 바꿔야 하는 문제이다.

✅ 가능한 원인

원인 설명
Apache 라이브러리가 JDK 11+에서 컴파일됨 예: commons-compress 최신 버전
실행 JVM이 실제로는 Java 11+ 빌드는 1.8로 했지만, 실행 JVM은 다를 수 있음
외부 JAR 포함된 .class가 고버전에서 컴파일됨 해당 라이브러리가 Java 11+ API를 사용함

🔧 해결 방법

  1. Apache Commons Compress 라이브러리 다운그레이드

    • 1.20 이하 버전은 Java 8과 호환 가능
  2. 실행 JVM 확인

    java -version
  3. 의존성 트리 확인

    • Maven: mvn dependency:tree
    • Gradle: ./gradlew dependencies
  4. JD-GUI 등으로 의심 JAR 내부 클래스 확인

    • .limit().position() 같은 체이닝 사용 여부 점검

🔁 Java 8 호환 예시 코드

// Java 11+ 가능
buffer.limit(50).position(10);

// Java 8에서는 아래처럼 사용
buffer.limit(50);       // void 반환
buffer.position(10);    // 체이닝 불가

📦 Maven 예시

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-compress</artifactId>
  <version>1.20</version> <!-- Java 8 호환 -->
</dependency>

✅ 결론

  • 이 에러는 Java 8에서는 사용할 수 없는 메서드 시그니처가 포함된 .class 파일로 인해 발생.
  • 라이브러리 버전 확인 및 실행 JVM 확인이 핵심.
  • 필요 시 JAR 직접 재컴파일 또는 다운그레이드 권장.

일단 저는 Apache Commons Compress 라이브러리 다운그레이드를 시도해 보겠습니다.