问题描述
我正在使用 RestHighLevelClient
,在 main
方法中我使用了 IndexRequest
(由于已弃用,此方法已关闭)。我使用 7.10.1 弹性搜索。当我运行程序时,出现以下错误消息:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig
at org.elasticsearch.client.RestClientBuilder.createHttpClient(RestClientBuilder.java:211)
at java.security.AccessController.doPrivileged(Native Method)
at org.elasticsearch.client.RestClientBuilder.build(RestClientBuilder.java:201)
at org.elasticsearch.client.RestHighLevelClient.<init>(RestHighLevelClient.java:291)
at org.elasticsearch.client.RestHighLevelClient.<init>(RestHighLevelClient.java:283)
at com.gihub.simplesteph.kafka.tutorial3.ElasticSearchConsumer.createClient(ElasticSearchConsumer.java:41)
at com.gihub.simplesteph.kafka.tutorial3.ElasticSearchConsumer.main(ElasticSearchConsumer.java:46)
Caused by: java.lang.classNotFoundException: org.apache.http.client.config.RequestConfig
at java.net.urlclassloader.findClass(urlclassloader.java:382)
at java.lang.classLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.classLoader.loadClass(ClassLoader.java:351)
... 7 more
我需要您的支持来解决我的问题,下面是ElasticSearchConsumer.java
和pom.xml
的代码。我尝试了很多食谱,但我遇到了同样的错误。
package com.gihub.simplesteph.kafka.tutorial3;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncclientBuilder;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class ElasticSearchConsumer {
public static RestHighLevelClient createClient(){
// replace with your own credentials
String hostname = "xxxxxxxxxxxxxxxxxxxxxxxx";
String username = "xxxxxxxxxx";
String password = "xxxxxxx";
//don't do if you run a local ES
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(username,password));
RestClientBuilder builder = RestClient.builder(
new HttpHost(hostname,443,"https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncclientBuilder customizeHttpClient(HttpAsyncclientBuilder httpAsyncclientBuilder) {
return httpAsyncclientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
public static void main(String[] args) throws IOException {
Logger logger = LoggerFactory.getLogger(ElasticSearchConsumer.class.getName());
RestHighLevelClient client = createClient();
String jsonString = "{ \"foo\": \"bar\" }";
IndexRequest indexRequest = new IndexRequest("twitter","tweets" ).source(jsonString,XContentType.JSON);
IndexResponse indexResponse = client.index(indexRequest,RequestOptions.DEFAULT);
String id = indexResponse.getIndex();
logger.info(id);
//close the client gracefully
client.close();
}
}
pom.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>kafka-beginners-course</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>kafka-consumer-elasticsearch</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<!-- <scope>test</scope>-->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
</dependencies>
</project>
谢谢!
解决方法
NoClassDefFoundError
通常表示依赖在编译时存在,但在运行时不存在。
您需要确保在运行项目时它具有所有 the necessary dependencies on the classpath
,如果您的设置中有多个模块,则在主模块中添加 org.apache.httpcomponents
依赖项,这对我有用。
并且在创建 IndexRequest
时,不要在构造函数中添加主题,
像这样使用它:
IndexRequest indexRequest = new IndexRequest(
"ur_index"
).source(urJsonString,XContentType.JSON);