Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Java 9 미만 환경에서 java.lang.NoSuchMethodError 발생

Đang mở
#340 4 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
45/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
java
Lĩnh vực
build-system

Hướng nghiên cứu

Bắt đầu tại src/main/java/net/spy/memcached/protocol/TCPMemcachedNodeImpl.java:147 và kiểm tra cấu hình trình biên dịch Maven cùng bytecode được tạo ra. Tái hiện build trên Java 9 hoặc mới hơn, xác minh chữ ký lệnh gọi thu được và kiểm thử artifact trên runtime trước Java 9; được xem là hoàn tất khi client không còn phát sinh NoSuchMethodError và vẫn duy trì khả năng tương thích Java 6 đã nêu.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

deferred

이슈

arcus-java-client는 최소 Java 6 이상 버전을 지원한다. 하지만 Java 9 미만 환경에서 TCPMemcachedNodeImpl 클래스의 생성자 호출 시 아래와 같은 ByteBuffer.clear() 메소드의 NoSuchMethodError 현상이 발생한다.

java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;
	at net.spy.memcached.protocol.TCPMemcachedNodeImpl.<init>(TCPMemcachedNodeImpl.java:147) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.protocol.ascii.AsciiMemcachedNodeImpl.<init>(AsciiMemcachedNodeImpl.java:23) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.DefaultConnectionFactory.createMemcachedNode(DefaultConnectionFactory.java:220) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.MemcachedConnection.attachMemcachedNode(MemcachedConnection.java:542) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.MemcachedConnection.<init>(MemcachedConnection.java:131) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.DefaultConnectionFactory.createConnection(DefaultConnectionFactory.java:243) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.ConnectionFactoryBuilder$1.createConnection(ConnectionFactoryBuilder.java:444) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.MemcachedClient.<init>(MemcachedClient.java:223) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.plugin.FrontCacheMemcachedClient.<init>(FrontCacheMemcachedClient.java:53) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.ArcusClient.<init>(ArcusClient.java:326) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.ArcusClient.getInstance(ArcusClient.java:313) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.CacheManager.createArcusClient(CacheManager.java:432) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.CacheManager.commandCacheListChange(CacheManager.java:375) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at net.spy.memcached.CacheMonitor.processResult(CacheMonitor.java:103) ~[arcus-java-client-9.9.9.jar:9.9.9]
	at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:592) [zookeeper-3.4.14.jar:3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf]
	at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:508) [zookeeper-3.4.14.jar:3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf]

원인

Java 9부터 ByteBuffer의 일부 메소드가 Override 되었다. Override 된 메소드는 리턴 타입이 Buffer에서 ByteBuffer로 변경되었다.

변경된 메소드는 아래와 같다.

  • position(int newPosition)
  • limit(int newLimit)
  • flip()
  • clear()
  • mark()
  • reset()
  • rewind()

Java 9 미만

public abstract class ByteBuffer extends Buffer {
   // clear 메소드는 Buffer에 의해 상속됨
}
​
public abstract class Buffer {
  ...
  public Buffer clear() {
    position = 0;
    limit = capacity;
    mark = -1;
    return this;
  }
  ...
}

Java 9 이상

public abstract class ByteBuffer extends Buffer {
   ...
   ByteBuffer clear() {
       super.clear();
       return this;
   }
   ...
}

Java 9 이상의 환경에서 arcus-java-client를 배포(source 1.6, target 1.6 설정으로 빌드)하면 ByteBuffer.clear() 메소드 호출의 바이트 코드는 아래와 같이 Java 9 기준으로 생성된다.

$ javap -c TCPMemachedNodeImpl
... (생략) ...
288: invokevirtual #50                 // Method java/nio/ByteBuffer.clear:()Ljava/nio/ByteBuffer;
... (생략) ...

Java 9 미만 환경에서 ByteBuffer 클래스는 Buffer 클래스로부터 상속받은 Buffer.clear()라는 메소드는 존재하지만, ByteBuffer.clear() 라는 메소드는 존재하지 않는다. 따라서 Java 9 이상 환경에서 빌드된 arcus-java-client를 Java 9 미만에서 사용할 경우 메소드의 Signature를 찾을 수 없어 NoSuchMethodError가 발생한 것이다.

참고로 Java 9 미만 환경에서 arcus-java-client를 배포하면, ByteBuffer.clear() 메소드 호출의 바이트 코드는 아래와 같이 생성된다.

$ javap -c TCPMemachedNodeImpl
... (생략) ...
288: invokevirtual #50                 // Method java/nio/Buffer.clear:()Ljava/nio/Buffer;
... (생략) ...

해결 방법

해결 방법은 3가지다.

  1. Java 9 미만 환경에서 빌드한다.

  2. --release 옵션을 사용하여 빌드하여, 해당 버전을 기준으로 바이트코드를 생성한다. 이 옵션으로 빌드하려면 Java 9 이상의 환경을 요구한다.

<properties>
     <maven.compiler.release>6</maven.compiler.release>
</properties>

or

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>6</release>
    </configuration>
</plugin>
  1. Buffer로 타입 캐스팅하여, Buffer의 clear 메소드를 호출하도록 바이트 코드 변경을 유도한다.
Buffer buffer = ByteBuffer.allocate(1024);
buffer.clear();                    // Method java/nio/Buffer.clear:()Ljava/nio/Buffer;                  

((Buffer) buffer).clear();     // Method java/nio/Buffer.clear:()Ljava/nio/Buffer;

참고

Ngôn ngữ chính
Java
Star
56
Fork
49
Merge trung bình
3 ngày 21 giờ
Pull request đã merge (30 ngày)
2

Chuẩn bị môi trường

  • Không có Dockerfile hay tệp Docker Compose
  • Có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của naver/arcus-java-client

Tất cả issue của naver/arcus-java-client

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.