ElasticSearch 6.8.2升级rest-high-level-client后Jetty8部署报错求助
解决Elasticsearch Rest High Level Client升级后的Guice/Jetty部署错误
你遇到的这个ArrayIndexOutOfBoundsException本质是依赖版本冲突引发的Guice内部ASM类解析异常——旧版本的Guava(你提到的3.0大概率是笔误,这个版本过于古老,推测是30.0或其他相近版本)与Elasticsearch Rest High Level Client带来的依赖不兼容,再加上Jetty 8的类加载环境放大了这个问题。下面是具体的解决步骤:
1. 修复Guava版本冲突
Elasticsearch 6.8.2的Rest High Level Client依赖的是Guava 26.0-jre,你当前使用的Guava版本和这个版本差异极大,会引发大量兼容性问题。你需要统一项目中的Guava版本:
Maven配置示例:
<!-- 引入ES Rest High Level Client,排除自带的Guava --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.8.2</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入与ES兼容的Guava版本 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>26.0-jre</version> </dependency>
Gradle配置示例:
implementation('org.elasticsearch.client:elasticsearch-rest-high-level-client:6.8.2') { exclude group: 'com.google.guava', module: 'guava' } implementation 'com.google.guava:guava:26.0-jre'
2. 解决Guice的ASM依赖冲突
报错中的数组越界来自Guice内部的ASM类解析器,这通常是Jetty 8自带的旧版ASM与Guice依赖的ASM版本冲突导致的。你可以通过以下方式处理:
- 升级Guice版本:如果你的Guice版本较旧,建议升级到与Guava 26.0-jre兼容的版本(比如
Guice 4.2.3),它依赖的ASM版本更稳定,能避免解析异常。 - 使用Shade插件隔离ASM:如果无法升级Guice,可以用Maven Shade插件将Guice依赖的ASM重命名,避免与Jetty的ASM冲突:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>org.objectweb.asm</pattern> <shadedPattern>your.package.shaded.asm</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
3. 调整Jetty类加载策略
嵌入式Jetty 8的类加载顺序可能优先加载了系统或容器自带的旧版依赖,导致WEB-INF/lib中的新依赖无法生效。你可以调整类加载优先级:
WebAppContext webAppContext = new WebAppContext(); // 设置为false,让WEB-INF/lib中的类优先于父类加载器加载 webAppContext.setParentLoaderPriority(false);
验证步骤
- 执行
mvn dependency:tree(或Gradle的dependencies命令),确认项目中只有Guava 26.0-jre这一个版本,没有其他Guava依赖。 - 清理项目编译目录(
target或build),重新编译打包后部署到Jetty。
内容的提问来源于stack exchange,提问作者Avinaba GHOSH HAJRA
相关产品推荐
相关产品推荐

