이상하다.. 평소 쓰던 소스였는데...
에러가 난다. 아마 협업으로 쓰고 있기 때문에 에러가 발생할 수 있다는 생각은 들지만... 이상하다
에러를 알아 보았다.
📌 에러 메시지
심각: 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를 사용함 |
🔧 해결 방법
Apache Commons Compress 라이브러리 다운그레이드
1.20이하 버전은 Java 8과 호환 가능
실행 JVM 확인
java -version의존성 트리 확인
- Maven:
mvn dependency:tree - Gradle:
./gradlew dependencies
- Maven:
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 라이브러리 다운그레이드를 시도해 보겠습니다.
'개발 > java,spring' 카테고리의 다른 글
| REST API 설계 기본 원칙 정리 (백엔드 개발자를 위한 가이드) (0) | 2026.03.19 |
|---|---|
| springframework.web.filter.CharacterEncodingFiler cannot be cast to class jakarta.servlet.Filter (0) | 2025.07.20 |
| dynamic web module facet version 5.0 was not found (1) | 2025.07.17 |
| [Java 컴파일 경고] 세부사항을 보려면 -Xlint:unchecked (1) | 2025.07.03 |
| [java] xml 파싱 dtd 경로를 읽어 에러가 나는 경우 무시하기. (1) | 2024.08.30 |
| 외부 라이브러리 자바(java) jar 파일 생성 및 실행(vendorName == null!) 에러 해결 (0) | 2020.05.07 |
| [java] split multi_tif single page(멀티 tif 파일 쪼개기) (0) | 2020.01.20 |