创建IgniteSinkConnector时出现NoClassDefFoundError问题求助
部署IgniteSinkConnector遇到NoClassDefFoundError问题
问题背景
尝试部署分布式IgniteSinkConnector失败,启动时抛出java.lang.NoClassDefFoundError: org/apache/ignite/internal/util/typedef/internal/A,该类已存在于插件目录的uberJar中的ignite-core-2.9.1.jar内。
API创建连接器的请求体
{ "name": "ignite-connector", "config": { "connector.class": "org.apache.ignite.stream.kafka.connect.IgniteSinkConnector", "tasks.max": "2", "topics": "someTopic1", "cacheName": "myCache", "cacheAllowOverwrite": true, "igniteCfg":"/opt/ignite/examples/config/example-cache.xml" } }
插件配置方式
- 构建Ignite Kafka扩展的uber-jar,放入独立目录
- 在
connect-distributed.sh对应的.properties文件中配置该目录为插件路径 - 通过systemd设置CLASSPATH:
Environment=CLASSPATH=/opt/kafka/ignite-connector/*
完整错误日志
[2022-11-17 19:49:30,268] INFO [ignite-connector|worker] SinkConnectorConfig values: config.action.reload = restart connector.class = org.apache.ignite.stream.kafka.connect.IgniteSinkConnector errors.deadletterqueue.context.headers.enable = false errors.deadletterqueue.topic.name = errors.deadletterqueue.topic.replication.factor = 3 errors.log.enable = false errors.log.include.messages = false errors.retry.delay.max.ms = 60000 errors.retry.timeout = 0 errors.tolerance = none header.converter = null key.converter = null name = ignite-connector predicates = [] tasks.max = 2 topics = [someTopic1] topics.regex = transforms = [] value.converter = null (org.apache.kafka.connect.runtime.SinkConnectorConfig:376) [2022-11-17 19:49:30,272] INFO [ignite-connector|worker] EnrichedConnectorConfig values: config.action.reload = restart connector.class = org.apache.ignite.stream.kafka.connect.IgniteSinkConnector errors.deadletterqueue.context.headers.enable = false errors.deadletterqueue.topic.name = errors.deadletterqueue.topic.replication.factor = 3 errors.log.enable = false errors.log.include.messages = false errors.retry.delay.max.ms = 60000 errors.retry.timeout = 0 errors.tolerance = none header.converter = null key.converter = null name = ignite-connector predicates = [] tasks.max = 2 topics = [someTopic1] topics.regex = transforms = [] value.converter = null (org.apache.kafka.connect.runtime.ConnectorConfig$EnrichedConnectorConfig:376) [2022-11-17 19:49:30,276] INFO [ignite-connector|worker] Instantiated connector ignite-connector with version 3.3.1 of type class org.apache.ignite.stream.kafka.connect.IgniteSinkConnector (org.apache.kafka.connect.runtime.Worker:322) [2022-11-17 19:49:30,276] INFO [ignite-connector|worker] Finished creating connector ignite-connector (org.apache.kafka.connect.runtime.Worker:347) [2022-11-17 19:49:30,277] ERROR [ignite-connector|worker] WorkerConnector{id=ignite-connector} Error while starting connector (org.apache.kafka.connect.runtime.WorkerConnector:201) java.lang.NoClassDefFoundError: org/apache/ignite/internal/util/typedef/internal/A at org.apache.ignite.stream.kafka.connect.IgniteSinkConnector.start(IgniteSinkConnector.java:55) at org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:193) at org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:218) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:363) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:346) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:146) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:123) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) [2022-11-17 19:49:30,277] INFO [Worker clientId=connect-1, groupId=connect-cluster] Finished starting connectors and tasks (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1687) [2022-11-17 19:49:30,280] ERROR [ignite-connector|worker] [Worker clientId=connect-1, groupId=connect-cluster] Failed to start connector 'ignite-connector' (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1811) org.apache.kafka.connect.errors.ConnectException: Failed to start connector: ignite-connector at org.apache.kafka.connect.runtime.distributed.DistributedHerder.lambda$startConnector$35(DistributedHerder.java:1782) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:146) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:123) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: org.apache.kafka.connect.errors.ConnectException: Failed to transition connector ignite-connector to state STARTED ... 8 more Caused by: java.lang.NoClassDefFoundError: org/apache/ignite/internal/util/typedef/internal/A at org.apache.ignite.stream.kafka.connect.IgniteSinkConnector.start(IgniteSinkConnector.java:55) at org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:193) at org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:218) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:363) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:346) ... 7 more
解决思路
- 检查类加载隔离:Kafka Connect插件类加载器是隔离的,确保uber-jar中的ignite-core依赖没有被其他插件或Connect核心类加载器覆盖。可尝试将ignite-core-2.9.1.jar单独放入插件目录,或确认uber-jar是否正确打包所有内部类依赖。
- 验证CLASSPATH有效性:通过
ps命令查看Connect进程的环境变量,确认CLASSPATH是否正确传递。若systemd配置未生效,需重启systemd服务或检查配置优先级。 - 版本兼容性校验:确认IgniteSinkConnector(3.3.1)与ignite-core(2.9.1)版本兼容。不同Ignite版本内部类结构可能变化,尝试使用与连接器版本匹配的ignite-core重新构建uber-jar。
- 插件目录配置检查:确保
connect-distributed.properties中的plugin.path正确指向插件目录,且目录权限允许Connect进程读取jar文件。 - 确认类存在性:执行
jar tf ignite-core-2.9.1.jar | grep "org/apache/ignite/internal/util/typedef/internal/A.class",验证该类确实存在于jar包中,排除打包遗漏问题。
内容的提问来源于stack exchange,提问作者inetphantom
相关产品推荐
相关产品推荐

