Azure Eventhub项目引入Servicebus报NoClassDefFoundError

前提

现有项目使用azure eventhub作为IOT数据载体进行数据传输。由于业务需要,需要同时引入servicebus。

java 复制代码
 <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-messaging-servicebus</artifactId>
      <version>7.13.3</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-messaging-eventhubs</artifactId>
      <version>5.11.1</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
      <version>1.12.0</version>
    </dependency>

错误

当引入servicebus jar后,单独写main测试类servicebus运行正常,但将servicebus服务注册到spring之后,启动项目eventhub相关类会抛出如下异常:

java.lang.NoClassDefFoundError: com/azure/core/amqp/implementation/TracerProvider

java 复制代码
Caused by: java.lang.NoClassDefFoundError: com/azure/core/amqp/implementation/TracerProvider
	at com.azure.messaging.eventhubs.EventHubClientBuilder.buildAsyncClient(EventHubClientBuilder.java:813)
	at com.azure.messaging.eventhubs.EventHubClientBuilder.buildAsyncProducerClient(EventHubClientBuilder.java:743)

分析

报错的包位于core目录,这是eventhub和servicebus共同依赖的项,因此大概率是因为引入servicebus后由于依赖冲突导致eventhub依赖项版本不对所以运行失败。

解决

通过Dependency Analyzer看到eventhub与servicebus所依赖的azure-core,azure-core-amqp版本的确冲突。

通过尝试调整eventhub及servicebus版本解决冲突

java 复制代码
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-messaging-eventhubs</artifactId>
      <version>5.15.1</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>
      <version>1.16.2</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-messaging-servicebus</artifactId>
      <version>7.13.1</version>
    </dependency>

至此,该问题得以解决,项目运行正常。

总结

maven冲突是很常见的现象,有些冲突也不会影响项目正常运行,依赖冲突出现的时候,Maven版本选择主要有以下两个原则:

  1. 最短路径优先原则:当存在多个版本的同一个依赖时,Maven会选择依赖路径最短的版本。例如,如果A->B->C(1.0)和A->D->C(2.0),那么C(1.0)会被选择,因为B到C的路径比D到C的路径更短。
  2. 第一声明优先原则:在pom.xml文件中定义的依赖,以首先定义的依赖为基准。如果两个依赖声明了同一个依赖,但是版本不同,那么先声明的版本将被使用。

解决maven冲突最好是通过调整依赖版本使之一致,当然还有其他办法,比如:

  1. 排除:如果某个依赖引入了不需要的传递依赖,可以在该依赖声明中使用exclusions标签排除不需要的传递依赖。例如,如果A依赖引入了B,而B又引入了C,但你不想要C,你可以在A的依赖声明中排除C。
  2. 版本锁定:在pom.xml文件的<dependencyManagement>标签中,可以指定某个依赖的版本,这样无论在哪个模块中引入该依赖,都会使用指定的版本。这样可以确保整个项目中该依赖的版本一致,避免版本冲突。
相关推荐
m0_4665252918 小时前
从火柴人看护画面看云从科技生态企业的隐私保护实践
大数据·人工智能·科技·microsoft
大模型码小白19 小时前
告别造假数据,直接连数据库查真实时序数据喂给 TimechoAI 大模型
java·数据库·人工智能·microsoft·架构
海盗12341 天前
微软技术日报 2026-09-14:Rust 升为微软一级语言,云业务重组为智能体与基础设施
开发语言·microsoft·rust
howard20051 天前
3.3 开发环境 - Maven
maven·安装·配置·阿里镜像源
ManageEngineITSM1 天前
什么是IT服务连续性管理?灾难恢复与业务连续性一文讲清
数据库·microsoft·工单系统·变更管理
xinjia_ctrl2 天前
暑假实习总结
git·后端·spring·maven·intellij-idea
秦哈哈2 天前
【Hello Agents】学习笔记(二)
笔记·学习·microsoft
承渊政道2 天前
Python IDLE鸿蒙PC适配全记录:用 ArkUI 重建编辑、运行、Shell 与基础调试闭环
python·microsoft·harmonyos·鸿蒙系统·pc端
网络豆2 天前
Apache Maven 鸿蒙 PC 适配全记录:把 JVM 构建工具交付到 HiShell
maven·apache·harmonyos
啾啾Fun2 天前
【AI Coding】5-Pi Agent Harness:一个极简终端编码Harness的解构
人工智能·microsoft·ai agent·claude code·ai coding