Может ли один класс вызывать ошибку несовместимости с самим собой?

#java #scala #apache-spark

#java #scala #apache-spark

Вопрос:

Запуск приложения Java (которое использует библиотеки spark scala) Я получаю:

 Caused by: java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class org/apache/spark/rpc/RpcEndpoint. Method 'java.lang.String $anonfun$self$1()' at index 49 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
    at org.apache.spark.rpc.RpcEndpoint.self(RpcEndpoint.scala:61)
    at org.apache.spark.rpc.RpcEndpoint.self$(RpcEndpoint.scala:60)
    at org.apache.spark.storage.BlockManagerMasterHeartbeatEndpoint.self(BlockManagerMasterHeartbeatEndpoint.scala:29)
    at org.apache.spark.rpc.RpcEndpoint.stop(RpcEndpoint.scala:130)
    at org.apache.spark.rpc.RpcEndpoint.stop$(RpcEndpoint.scala:129)
    at org.apache.spark.storage.BlockManagerMasterHeartbeatEndpoint.stop(BlockManagerMasterHeartbeatEndpoint.scala:29)
    at org.apache.spark.storage.BlockManagerMasterHeartbeatEndpoint$$anonfun$receiveAndReply$1.applyOrElse(BlockManagerMasterHeartbeatEndpoint.scala:40)
    at org.apache.spark.rpc.netty.Inbox.$anonfun$process$1(Inbox.scala:103)
    ... 7 more
  

Я понял, что IncompatibleClassChangeError возникает, когда один класс вызывает другой, ожидая одну структуру, но находит другую (например, потому что библиотека изменилась с тех пор, как клиент был скомпилирован против нее).

Однако этот stacktrace предполагает, что ошибка возникает из-за вызова RpcEndpoint самого себя. Как это возможно? Что я неправильно понял?

Кроме того, обратите внимание, что следующий класс в stacktrace происходит из того же jar (spark-core_2.12-3.0.0.jar ).

Комментарии:

1. вы видели сообщение «CONSTANT_MethodRef и должно быть CONSTANT_InterfaceMethodRef»? В сообщении говорится, что он искал реализованный метод интерфейса, но нашел обычный метод. Может быть, вы забыли аннотацию @Override?

2. описание здесь выглядит уместным, хотя я еще не нашел исправленную ошибку JDK … issues.apache.org/jira/browse/CURATOR-509

Ответ №1:

Кажется, это вызвано комбинацией

https://bugs.openjdk.java.net/browse/JDK-8147755 (ошибка в ASM)

и

https://bugs.openjdk.java.net/browse/JDK-8145148 (сбой с IncompatibleClassChangeError, если ASM не исправлен)

появляется, потому что мы затеняли spark jar с помощью версии плагина shade (2.3), который использовал старую версию ASM (5.0.2) до того, как она была исправлена здесь

https://issues.apache.org/jira/browse/MSHADE-228

а затем использовали версию JDK, которая заботилась об ошибке ASM (мы использовали JDK 11.0.6).