出現可怕的NoSuchMethodError錯誤的解決辦法 -Gunnar Morling

banq發表於2020-12-23

前幾天,Debezium社群的使用者報告了一個有趣的問題。他們在Java 1.8上使用Debezium,結果很奇怪NoSuchMethodError:

java.lang.NoSuchMethodError: java.nio.ByteBuffer.position(I)Ljava/nio/ByteBuffer;
  at io.debezium.connector.postgresql.connection.Lsn.valueOf(Lsn.java:86)
  at io.debezium.connector.postgresql.connection.PostgresConnection.tryParseLsn(PostgresConnection.java:270)
  at io.debezium.connector.postgresql.connection.PostgresConnection.parseConfirmedFlushLsn(PostgresConnection.java:235)
  ...


NoSuchMethodError表示Java版本不匹配:一些方法在編譯時存在,但卻在執行時不可用。
解決辦法:
應該使用--release開關代替--source/ --target。為了在基於Maven的構建中實現相同目的,只需在pom.xml中指定以下屬性:

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


從理論上講,使用--source和時也可以達到相同的效果--target。透過該--boot-class-path選項,您可以建議編譯器使用一組特定的載入程式類檔案,而不是使用JDK中用於編譯的檔案。但這會麻煩得多,因為它要求您實際提供目標Java版本的類,而--release將利用當前使用的JDK本身附帶的簽名資料。
 

相關文章