在运行 kafka-connect-ftp 的连接器时显示以下错误
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.apache.kafka.connect.runtime.isolation.PluginClassLoader.loadClass(PluginClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.apache.kafka.connect.runtime.isolation.PluginClassLoader.loadClass(PluginClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.getPluginDesc(DelegatingClassLoader.java:279)
at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanPluginPath(DelegatingClassLoader.java:260)
at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanUrlsAndAddPlugins(DelegatingClassLoader.java:201)
at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.registerPlugin(DelegatingClassLoader.java:193)
at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.initLoaders(DelegatingClassLoader.java:153)
at org.apache.kafka.connect.runtime.isolation.Plugins.<init>(Plugins.java:47)
at org.apache.kafka.connect.cli.ConnectStandalone.main(ConnectStandalone.java:75)
我已经参考了两个社区网站,它们已经在融合连接器网站中给出 https://github.com/Eneco/kafka-connect-ftp https://github.com/Landoop/stream-reactor
任何人都可以为此错误提出解决方案。
此连接器有两个主要问题:
- 它捆绑了来自Connect的API的类及其依赖项。也就是说,它将类捆绑在包
org.apache.kafka.connect
.不建议这样做,此类依赖项应标记为提供。 - 连接器因类加载问题而失败的实际原因是它依赖于(至少根据其
master
分支)Apache Kafka 版本,该版本可能与部署的 Connect worker 的版本不匹配。具体来说,这取决于哪个不是最新的kafkaVersion = '0.10.2.0'
。Kafka Connect 在其提供类加载隔离的最新版本中,将忽略它认为的系统类,例如当连接器的 jar 导入org.apache.kafka.connect
中的类时。相反,它将从 Apache Kafka 附带的 Kafka Connect jar 中加载此类类。
上述问题可能会导致类加载失败,正如您观察到的那样。
理想情况下,应在连接器级别解决它们。
您可以应用的解决方法包括:
- 从源代码构建连接器代码,在升级它所依赖的 Kafka 版本后。同时将其 Kafka 依赖项标记为提供(包括 Kafka Connect 和 Kafka 客户端依赖项)。或
- 降级已部署的 Kafka Connect 版本,使其与连接器当前依赖的版本完全匹配。
此处记录了类似的问题: 卡夫卡蒙戈德布接收器连接器未启动