PyFlink "pipeline.classpaths" 对比 $FLINK_HOME/lib

PyFlink "pipeline.classpaths" vs $FLINK_HOME/lib

class 加载作为 PyFlink pipeline.classpath 配置的一部分传递的 classes 和将它们放入 $FLINK_HOME\lib 目录之间有什么区别?

当我想使用 flink-sql-connector-kafka-*.jar 时,只需使用 pipeline.classpath 传递它就可以正常工作,但是当我想使用具有某些外部依赖性的东西时,例如需要 [=18] 的 flink-avro-*.jar =] 罐子。它似乎加载 flink-avro-*.jar 但它看起来无法加载 avro-*.jar 并抛出:

java.lang.NoClassDefFoundError: Could not initialize class org.apache.avro.SchemaBuilder

当我将 avro-*.jar 添加到 $FLINK_HOME\lib 时,它工作得很好。

NoClassDefFoundError 和 ClassNotFoundException 不同

  1. java.lang.ClassNotFoundException 这个异常说明 在 class 路径上找不到 class。这表明我们当时 试图加载 class 定义,而 class 不存在于 class路径。
  2. java.lang.NoClassDefFoundError这个异常说明JVM 查看其内部 class 定义数据结构 定义了一个class,没找到。这不同于 说无法从 class 路径加载它。重点是, NoClassDefFoundError 不一定是 class 路径问题。

flink-sql-avro-*.jar 是一个阴影 jar,它将重新定位 org.apache.flink:flink-avro org.apache.avro:avro

的路径

从NoClassDefFoundError判断可能是avro版本依赖有冲突