kafka stream官网wordcount例子错误:java.lang.UnsatisfiedLinkError

本文介绍了一种使用Kafka Streams进行实时数据流处理时遇到的问题,即与RocksDBJNI版本不匹配导致的UnsatisfiedLinkError错误。通过调整Maven依赖,排除默认的RocksDBJNI依赖并引入指定版本和平台的RocksDBJNI库,成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入maven依赖:

<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka-streams</artifactId>
	<version>1.0.1</version>
</dependency>

kafka stream代码如下:

Properties pro = new Properties();
		pro.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-application");
		pro.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka01.lycheepay.org:9092");
		pro.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
		pro.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
		StreamsBuilder builder = new StreamsBuilder();
		KStream<String, String> textLines = builder.stream("TextLinesTopic");
		KTable<String, Long> wordCounts = textLines.flatMapValues(textLine -> Arrays.asList(textLine.toLowerCase().split(",")))
				.groupBy((key, word) -> word)
				.count(Materialized.<String, Long, KeyValueStore<Bytes, byte[]>>as("counts-store"));
		wordCounts.toStream().to("WordsWithCountsTopic", Produced.with(Serdes.String(), Serdes.Long()));
		KafkaStreams streams = new KafkaStreams(builder.build(), pro);
		streams.start();

报错信息如下:

Exception in thread "wordcount-application-16d9a853-e79e-4cd6-93a4-d6c5dfca3f31-StreamThread-1" java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\librocksdbjni6794372279748237162.dll: �
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(Unknown Source)
	at java.lang.ClassLoader.loadLibrary(Unknown Source)
	at java.lang.Runtime.load0(Unknown Source)
	at java.lang.System.load(Unknown Source)
	at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.java:78)
	at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:56)
	at org.rocksdb.RocksDB.loadLibrary(RocksDB.java:64)
	at org.rocksdb.RocksDB.<clinit>(RocksDB.java:35)
	at org.rocksdb.Options.<clinit>(Options.java:25)
	at org.apache.kafka.streams.state.internals.RocksDBStore.openDB(RocksDBStore.java:128)
	at org.apache.kafka.streams.state.internals.RocksDBStore.init(RocksDBStore.java:185)
	at org.apache.kafka.streams.state.internals.ChangeLoggingKeyValueBytesStore.init(ChangeLoggingKeyValueBytesStore.java:40)
	at org.apache.kafka.streams.state.internals.CachingKeyValueStore.init(CachingKeyValueStore.java:59)
	at org.apache.kafka.streams.state.internals.InnerMeteredKeyValueStore.init(InnerMeteredKeyValueStore.java:160)
	at org.apache.kafka.streams.state.internals.MeteredKeyValueBytesStore.init(MeteredKeyValueBytesStore.java:104)
	at org.apache.kafka.streams.processor.internals.AbstractTask.registerStateStores(AbstractTask.java:225)
	at org.apache.kafka.streams.processor.internals.StreamTask.initializeStateStores(StreamTask.java:163)
	at org.apache.kafka.streams.processor.internals.AssignedTasks.initializeNewTasks(AssignedTasks.java:122)
	at org.apache.kafka.streams.processor.internals.TaskManager.updateNewAndRestoringTasks(TaskManager.java:260)
	at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:813)
	at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:774)
	at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:744)

解决方案如下:修改pom依赖,运行成功

<dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka-streams</artifactId>
			<version>1.0.1</version>
			<exclusions>
				<exclusion>
					<groupId>org.rocksdb</groupId>
					<artifactId>rocksdbjni</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.rocksdb</groupId>
			<artifactId>rocksdbjni</artifactId>
			<version>5.1.2</version>
			<classifier>win64</classifier>
		</dependency>

 

<think>好的,用户遇到了Java程序中KafkaProducer.close方法缺失导致的ArrayStoreException和NoSuchMethodError错误。首先,我需要回忆这两个异常通常的原因。 NoSuchMethodError通常是因为类路径中存在版本冲突,编译时用的库版本和运行时不一致。比如用户可能在编译时使用了较高版本的Kafka客户端,而运行时环境中的版本较低,缺少close方法。而ArrayStoreException可能是在尝试将一个不兼容类型的对象存入数组时抛出,这可能与Kafka依赖中的某些类版本不匹配有关,比如scala库版本冲突。 接下来,我需要考虑用户的环境配置。比如是否使用构建工具如Maven或Gradle,是否有多个依赖引入了不同版本的Kafka客户端或相关库(如scala-library)。用户可能没有正确排除冲突的依赖,或者依赖树中存在旧版本覆盖新版本的情况。 然后,解决方案需要分步骤。首先检查依赖版本,确认kafka-clients的版本是否一致,排除冲突。然后检查Scala库的兼容性,因为Kafka客户端依赖Scala,版本不匹配可能导致问题。清理构建工具缓存,确保重新下载正确依赖。运行时类路径检查,避免旧版本库被优先加载。如果问题依然存在,可能需要升级Kafka客户端到更新的稳定版本,或者降级到兼容版本。 另外,用户提到的ArrayStoreException可能与scala.collection.mutable.WrappedArray在运行时类型不匹配有关,这可能是因为不同版本的Scala库混用,导致数组类型不一致。例如,如果某个依赖强制使用了较旧的Scala版本,而Kafka客户端需要较新的,就会引发此问题。 需要提醒用户使用Maven的依赖树分析工具(如mvn dependency:tree)或Gradle的依赖报告,查找冲突的库,并进行排除。同时,确保所有模块使用的Kafka和Scala版本一致。部署时,检查服务器上的lib目录是否有旧版本的jar包,这可能导致类加载时冲突。 最后,可能需要提供具体的命令示例,比如如何在Maven中排除依赖,或者如何强制指定Scala版本,帮助用户实际操作。同时,引用相关的参考资料,特别是关于NoSuchMethodError的处理方法,如确保依赖一致性和清理构建缓存。</think>### 解决KafkaProducer.close方法缺失导致的ArrayStoreException和NoSuchMethodError #### 问题原因分析 1. **依赖版本冲突** `NoSuchMethodError`通常由依赖库版本不一致引起。例如: - 编译时使用了高版本的Kafka客户端(如3.5.0),但运行时加载了低版本(如2.8.0),导致`KafkaProducer.close()`方法不存在[^2][^3]。 - Kafka客户端依赖Scala运行时库,若Scala版本不兼容(如2.12与2.13),可能引发`ArrayStoreException`[^1]。 2. **类路径污染** 运行时环境中存在多个版本的Kafka客户端或Scala库,导致JVM加载了错误的类文件[^4]。 --- #### 分步解决方案 ##### 1. 检查并统一依赖版本 - **Maven项目**:在`pom.xml`中显式指定Kafka客户端版本,并排除冲突依赖: ```xml <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.5.0</version> <!--使用最新稳定版本--> <exclusions> <exclusion> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> </exclusion> </exclusions> </dependency> ``` 运行`mvn dependency:tree`检查依赖树,确保所有模块使用同一版本。 - **Gradle项目**:在`build.gradle`中强制版本对齐: ```gradle configurations.all { resolutionStrategy { force 'org.apache.kafka:kafka-clients:3.5.0' force 'org.scala-lang:scala-library:2.13.10' // 与Kafka兼容的Scala版本 } } ``` ##### 2. 清理构建缓存 - 删除本地Maven仓库中的旧版本(路径:`~/.m2/repository/org/apache/kafka`)或Gradle缓存(`~/.gradle/caches`)。 ##### 3. 运行时环境检查 - 若部署到Tomcat等服务器,检查`WEB-INF/lib`或服务器全局库中是否存在旧版本JAR文件,移除冲突版本。 ##### 4. 验证Scala兼容性 Kafka客户端对Scala版本有严格依赖: - Kafka 3.0+ 需要Scala 2.13+ - Kafka 2.8.x 需要Scala 2.12 通过以下命令确认Scala版本: ```bash java -cp kafka-clients-3.5.0.jar org.scala-lang.Version ``` ##### 5. 代码适配(可选) 若仍需使用旧版本Kafka客户端,修改`close()`方法调用: ```java // Kafka 0.11.0以下版本使用close()无参数 producer.close(); // Kafka 0.11.0+ 支持超时参数 producer.close(Duration.ofSeconds(30)); ``` --- #### 示例修复后的代码 ```java import org.apache.kafka.clients.producer.KafkaProducer; import java.time.Duration; public class SafeKafkaProducer { public static void main(String[] args) { KafkaProducer<String, String> producer = new KafkaProducer<>(props); try { // 生产消息逻辑 } finally { producer.close(Duration.ofSeconds(30)); // 显式指定超时 } } } ``` --- #### 相关问题 1. **如何排查Maven依赖树中的版本冲突?** 2. **Kafka客户端与Spark集成时的兼容性如何保证?** 3. **为什么Scala版本会导致Java程序抛出ArrayStoreException?** --- #### 引用 [^1]: Spark运行中因Scala版本冲突导致`NoSuchMethodError`的解决方案。 : Java中`NoSuchMethodError`的通用处理方法。 [^3]: 依赖冲突引发`Base64.encodeBase64String`方法缺失的案例。 : Tomcat部署时类版本不一致导致的方法签名错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值