Elasticsearch java.lang.ClassNotFoundException: org.elasticsearch.common.transport.InetSocketTrans...

本文详细记录了在使用SpringBoot连接Elasticsearch时遇到的ClassNotFoundException错误,具体为找不到InetSocketTransportAddress类的问题及解决过程。通过添加transport-netty4-client依赖,成功解决了连接问题。

在做Elasticsearch 版本升级的时候,报出了
java.lang.ClassNotFoundException: org.elasticsearch.common.transport.InetSocketTransportAddress 这个错误,在此记录一下解决方法

开发环境
IntelliJ IDEA 2018.1.6
maven3.3.3
SpringBoot 2.0.2.RELEASE
ElasticSearch 6.1.1
连接ElasticSearch 代码
@Value("${spring.data.elasticsearch.cluster-name}")
    private static String clusterName;
    @Value("${spring.data.elasticsearch.cluster-nodes}")
    private static String host;
    @Value("${spring.data.elasticsearch.properties.port}")
    private static Integer port;


    /** 构建Settings 对象 */
    private static Settings settings = Settings.builder().put("cluster.name", clusterName).build();
    /** TransportClient 对象, 用于连接ES集群 */
    private static volatile TransportClient client;

    /**
     * 同步synchronized(*.class)代码块的作用和synchronized static方法作用一样,
     * 对当前对应的*.class 进行持锁, static方法和.class 一样都是锁的该类本身,同一个监听器
     * @return
     */
    public static TransportClient getClient(){
        if(client == null){
            synchronized (TransportClient.class){
                client = new PreBuiltTransportClient(settings);
                try {
                    String[] allHost = host.split(",");
                    for (String str:allHost) {
                        client.addTransportAddresses(new TransportAddress(InetAddress.getByName(str), port));
                    }
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
            }
        }
        return client;
    }
错误日志
Exceptionin thread "main" java.lang.NoClassDefFoundError: org/elasticsearch/common/transport/InetSocketTransportAddress
    at org.elasticsearch.transport.Netty4Plugin.getSettings(Netty4Plugin.java:55)
    at org.elasticsearch.plugins.PluginsService.lambda$getPluginSettings$0(PluginsService.java:82)
    at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.elasticsearch.plugins.PluginsService.getPluginSettings(PluginsService.java:82)
    at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:135)
    at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:262)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:128)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:114)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:104)
    at com.zichan360.fica.controller.TestController.getClient(TestController.java:49)
    at com.zichan360.fica.controller.TestController.getAdminClient(TestController.java:64)
    at com.zichan360.fica.controller.TestController.isExists(TestController.java:79)
    at com.zichan360.fica.controller.TestController.main(TestController.java:68)
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.common.transport.InetSocketTransportAddress
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 19 more
解决方法

添加 transport-netty4-client maven 依赖之后可以成功获取到连接

<dependency>
        <groupId>org.elasticsearch.plugin</groupId>
        <artifactId>transport-netty4-client</artifactId>
        <version>6.1.1</version>
   </dependency>
<think>好的,我现在需要帮助用户解决Java中因缺少org.elasticsearch.client.RestHighLevelClient类导致的ClassNotFoundException问题。用户提到的是Maven依赖配置或导入方法,所以我应该从检查依赖配置入手。 首先,用户遇到的ClassNotFoundException通常是因为项目缺少相关的库依赖。对于Elasticsearch的RestHighLevelClient,我需要确认正确的Maven依赖坐标。记得Elasticsearch的不同版本可能有不同的groupId或artifactId,尤其是新旧版本之间的差异。比如,旧版本的客户端可能使用org.elasticsearch.client,而新版本可能改为co.elastic.clients。 用户问题中的类名是org.elasticsearch.client.RestHighLevelClient,所以应该属于ElasticsearchJava高级REST客户端。这个客户端在7.x版本中仍然存在,但到了8.x版本可能被弃用,改用新的客户端。因此,用户可能使用的是较旧的Elasticsearch版本,比如7.x。 接下来,我需要查找正确的Maven依赖配置。正确的groupId应该是org.elasticsearch.client,artifactId是elasticsearch-rest-high-level-client,版本需要与Elasticsearch服务端版本一致。例如,如果用户用的是7.10.2,依赖应该如下: <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.10.2</version> </dependency> 同时,需要注意依赖的传递性。可能还需要引入其他相关依赖,比如elasticsearch-rest-clientelasticsearch-core。不过,通常只需要声明高级客户端依赖,Maven会自动处理传递依赖。但如果出现其他类找不到的情况,可能需要显式添加这些依赖。 另外,用户可能混淆了transport客户端和REST客户端。Transport客户端在7.x中已被标记为废弃,推荐使用REST客户端。因此,用户不应该再使用transport-netty4-client,而是应该使用REST相关的依赖。 此外,版本冲突也是常见问题。如果项目中的其他Elasticsearch相关依赖版本不一致,可能会导致类找不到。需要确保所有Elasticsearch相关的依赖版本一致。 还有可能用户的Maven仓库中没有正确下载该依赖。可以建议用户清理Maven本地仓库并重新下载,或者检查网络设置,确保能访问Maven中央仓库。 最后,如果用户已经升级到Elasticsearch 8.x,可能需要改用新的Java客户端,即co.elastic.clients的依赖,这时候原来的RestHighLevelClient会被弃用。但用户的问题明确提到了RestHighLevelClient,所以应该针对7.x版本提供解决方案。 总结步骤: 1. 确认Elasticsearch版本,添加对应版本的REST高级客户端依赖。 2. 检查依赖传递和版本一致性。 3. 清理Maven并重新构建。 4. 示例代码展示如何正确初始化客户端。</think>### 解决方案:缺少`RestHighLevelClient`的依赖配置方法 #### 1. **确认Elasticsearch版本** 首先需确保Maven依赖的版本**与Elasticsearch服务端版本完全一致**。若服务端版本为`7.17.3`,客户端版本也需为`7.17.3`。 #### 2. **添加Maven依赖** ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.17.3</version> <!-- 替换为实际版本 --> </dependency> ``` - 该依赖会自动引入`elasticsearch-rest-client`和`elasticsearch-core`等底层库[^1]。 #### 3. **处理版本冲突** - 若项目中存在其他Elasticsearch相关依赖(如`elasticsearch`、`transport-netty4-client`),需确保所有依赖版本一致: ```xml <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.17.3</version> </dependency> ``` #### 4. **初始化客户端示例代码** ```java import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; public class ESClient { public static void main(String[] args) { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 使用client操作ES } } ``` #### 5. **依赖未生效的排查** - **清理Maven本地仓库**:删除`.m2/repository/org/elasticsearch`目录后重新构建。 - **检查IDE缓存**:在IntelliJ/Eclipse中执行**Maven -> Reimport**。 - **显式添加缺失依赖**(若存在部分类未找到): ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.17.3</version> </dependency> ``` --- ### 常见问题扩展 1. **Elasticsearch 8.x的适配** Elasticsearch 8.x推荐使用新的Java客户端`co.elastic.clients`,需替换依赖: ```xml <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.11.4</version> </dependency> ``` 2. **兼容性错误处理** 若出现`NoSuchMethodError`或`ClassNotFoundException`,使用`mvn dependency:tree`检查依赖树,排除冲突版本: ```xml <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑点燃希望

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值