SpringBoot2.X+Elasticsearch6+x-pack启动报错

SpringBoot2.0+Elasticsearch6启动报错

问题描述

SpringBoot+Elasticsearch6启动时,Spring项目一直报错,找不到 java.lang.NoClassDefFoundError: org/elasticsearch/common/transport/InetSocketTransportAddress
(我使用到了ES的x-pack插件,所以pom.xml文件中有这个jar包。如果没有用到这个插件,可以不用引入这个jar包)

问题分析

开始以为是确实缺少这个类,在网上也找了很多解决方案,总结起来无非就是pom里面引包引入的不全面。但是后来经过查询,发现InetSocketTransportAddress是Elasticsearch5.X版本时,需要根据ES的一些配置信息创建ES的client需要用到的类,而我当前引入的ES版本是6版本,按说生成client的时候已经不需要这个类了。但是看着报错信息,显然项目是用了ES5的这个版本。
有了这个怀疑后,打开项目的Maven依赖,果然发现
SpringBoot2.X+Elasticsearch6+x-pack启动报错
发现项目里的pom加载的依然是5.6X版本的。
但是本项目的Pom文件里,加载的都是Elasticsearch6的版本,pom文件如下:

<dependency>
		<groupId>org.elasticsearch.client</groupId>
		<artifactId>transport</artifactId>      
		<version>6.1.1</version>
</dependency>
<dependency>
     	<groupId>org.elasticsearch.client</groupId>
     	<artifactId>x-pack-transport</artifactId>          
     	<version>6.1.1</version>      
</dependency>
<dependency>
		<groupId>org.elasticsearch</groupId>
		<artifactId>elasticsearch</artifactId>
		<version>6.1.1</version>
</dependency>

之前同样的pom文件,在Spring1.5.X版本的时候,没有出现过这样的问题,所以怀疑是SpringBoot2.0导入了默认包导致的。查询SpringBoot2.0的包,(链接:https://github.com/spring-projects/spring-boot/blob/v2.0.5.RELEASE/spring-boot-project/spring-boot-dependencies/pom.xml
发现
SpringBoot2.X+Elasticsearch6+x-pack启动报错
所以怀疑是在Spring加载的时候,覆盖了本身我定义的配置。

解决方案

在自己项目的pom.xml文件中,显示声明elasticsearch的版本,如下

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.5.RELEASE</version>
        <elasticsearch.version>6.1.1</elasticsearch.version>
</parent>

问题得到解决,不进行报错
如果有其他同学遇到相关问题,还有别的解决方式,欢迎交流