出现可怕的NoSuchMethodError错误的解决办法 -Gunnar Morling


前几天,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本身附带的签名数据。