解决maven 父工程依赖传递导致的 java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject

这篇具有很好参考价值的文章主要介绍了解决maven 父工程依赖传递导致的 java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

因为项目需要,最近在学习elasticsearch,在使用elasticsearch Java 客户端时,出现了写问题,主要就是报各种的 NoClassDefFoundError

如:java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject,出现这种 NoClassDefFoundError 的问题基本上就是maven 依赖错误或者版本不对,于是顺着这个思路排查,摸到了问题所在。

案例描述

在尝试使用 elasticsearch-rest-high-level-client 客户端 7.17.4版本。

项目的依赖: elasticsearch-demo -> demo -> spring-boot-starter-parent :2.2.10.RELEASE

父工程demo的pom

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<packaging>pom</packaging>
   
    <modules>
		<module>elasticsearch-demo</module>
	</modules>
    
    <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.10.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
    <groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
		<!-- <elasticsearch.version>7.17.4</elasticsearch.version> -->
	</properties>
    
    <dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.elasticsearch.client</groupId>
				<artifactId>elasticsearch-rest-high-level-client</artifactId>
				<version>7.17.4</version>
				<!-- <version>${elasticsearch.version}</version> -->
			</dependency>
		</dependencies>
	</dependencyManagement>
    ........ 省略 ......
</project>
    

子工程elasticsearch-demo 的 pom

<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>demo</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>elasticsearch-demo</artifactId>
    <groupId>com.example</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elasticsearch-demo</name>
    
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>
    </dependencies>
       ........ 省略 ......
</project>

使用案例

本以为按照如上配置,就能安心使用java客户端进行对elasticsearch的操作了,但是如下执行会直接报错 : java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject

/**
 * @author lvzb
 * @date 2022/12/05  13:53
 **/
@Slf4j
public class ElasticSearchTest {

    @Test
    void connectEs() throws IOException {

        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
                new HttpHost("localhost", 9200, "http")
        ));

        GetIndexRequest request = new GetIndexRequest("index");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        // 索引是否存在
        System.out.println(exists);
        client.close();
    }
}
java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject

	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at com.example.redis.demo.config.ElasticSearchTest.connectEs(ElasticSearchTest.java:70)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
       ........ 省略 ......
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.xcontent.ToXContentObject
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 73 more

顺着异常的类,在elasticsearch-demo的Dependencies中发现了问题所在 [idea右侧菜单栏的Maven Dependencies ] 发现我的 org.elasticsearch.client:elasticsearch-rest-high-level-client:7.17.4下竟然存在一个 org.elasticsearch:elasticsearch:6.8.12

而且IDEA没有任何报错和依赖冲突的提示,这是为何?原来是demo 依赖的 父工程 spring-boot-starter-parent :2.2.10.RELEASE 他里面含有 org.elasticsearch:elasticsearch:6.8.12 被带过来了,而且竟然直接将我们在 demo 显示声明的 7.17.4中含有的给替换了。

解决:在 demo 工程的 pom 中 声明 elasticsearch.version,也就是上述案例代码中的 注释给打开,然后依赖里引用该版本号即可。注意:这里声明版本的用词要和 spring-boot-starter-parent 含有的依赖声明的版本用词要一致文章来源地址https://www.toymoban.com/news/detail-400998.html

到了这里,关于解决maven 父工程依赖传递导致的 java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决java.lang.NoClassDefFoundError错误

    在日常Java开发中,碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类明明还在,为什么找不到?而且我们很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的。 我们往

    2024年02月11日
    浏览(30)
  • Java.lang.NoClassDefFoundError 的解决方法

    Java.lang.NoClassDefFoundError 的解决方法 Java开发过程中,经常会遇到 java.lang.NoClassDefFoundError 错误。这个错误通常表示在运行时找不到所需的类。本文将探讨这个问题的原因,并提供一些解决方案。 当尝试运行 Java 应用程序时,可能会遇到以下错误消息: 该错误消息表明在运行时

    2024年02月08日
    浏览(37)
  • java.lang.NoClassDefFoundError异常的正确解决方法

    java.lang.NoClassDefFoundError 是 Java 运行时环境中的一个错误,表明 JVM 在运行时尝试加载一个类的定义,但未能找到。这通常发生在编译时该类是可用的,但在运行时 JVM 的类路径(classpath)上却找不到这个类。此错误不同于 ClassNotFoundException,后者通常在加载类时抛出,而 NoCl

    2024年04月25日
    浏览(59)
  • 解决 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错

    在使用POI导出Excel表格的时候,本地运行导出没问题,但是发布到服务器后提示 “java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader” 下面是pom.xml中的配置 一开始以为缺少jar包导致的,后来排查发现不是这个原因,是因为ooxml-schemas版本过低。对于poi 4.1.0和4.1.2来说,应该使用

    2024年01月21日
    浏览(33)
  • java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector解决方法

    今天在进行尚硅谷尚筹网环境部署的时候,使用测试方法时总是提示java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector这个错误,研究了好久没找到问题在哪,百度搜了好多也没找到方法,我用的是JDK17,突然想起没有装jre,所以试着把项目的JDK换成了JDK8,测试了一下好了

    2024年02月08日
    浏览(39)
  • 解决异常 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

    一、问题现象 用Tomcat启动Web工程的时候,catalina.out 日志文件中报错如下: 二、问题原因 服务器上的Java 的JDK版本是 11.0.4 ,版本过高。 JAXB API是java EE 的API,因此在Java SE 9.0 中不再包含这个 Jar 包。 Java 9 中引入了模块的概念,默认情况下,Java SE中将不再包含java EE 的Jar包。

    2024年02月07日
    浏览(32)
  • java.lang.NoClassDefFoundError: org.apache.poi.POIXMLDocument问题排查解决

    项目打包部署完成,用jar包在部署环境运行,在使用到poi相关的服务时报错 java.lang.NoClassDefFoundError: org.apache.poi.POIXMLDocument 然后我查找了些解决办法,对处理方法做了梳理: 使用XSSWorkbook,使用时出错 pom文件少引入依赖 包依赖冲突 使用模块没有声明所需依赖(这是我遇到的

    2024年02月06日
    浏览(75)
  • 解决java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter三更博客系统

    这个错误通常发生在使用JDK 9或更高版本的Java应用程序中,因为在这些版本中,JDK已经移除了JAXB默认实现的某些部分。 要解决这个问题,您可以尝试以下几个步骤: 升级您的应用程序以使用JAXB的最新实现。可以从Maven仓库或JAXB的官方网站中获取JAXB的最新版本。 1. 如果您使

    2024年02月15日
    浏览(64)
  • 解决`java.lang.NoClassDefFoundError`在Nacos和Spring Boot集成中的问题

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月11日
    浏览(34)
  • 解决报错信息:java.lang.NoClassDefFoundError: org/springframework/beans/factory/aot/BeanRegistrationAotProc

    ** java.lang.NoClassDefFoundError: org/springframework/beans/factory/aot/BeanRegistrationAotProcessor Exception in thread “main” java.lang.NoClassDefFoundError: org/springframework/beans/factory/aot/BeanRegistrationAotProcessor; Caused by: java.lang.ClassNotFoundException: org.springframework.beans.factory.aot.BeanRegistrationAotProcessor; java.lang.

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包