You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot 3.x集成Spring Cloud Netflix Eureka启动时出现java.lang.NoClassDefFoundError: jakarta/inject/Provider错误

Spring Boot 3.x集成Spring Cloud Netflix Eureka启动时出现java.lang.NoClassDefFoundError: jakarta/inject/Provider错误

我之前在Spring Boot3.x环境下集成Eureka的时候也遇到过一模一样的问题,结合你给出的环境信息(Java17、Spring Boot3.x、Maven),给你几个亲测有效的排查和解决方向:

1. 先确认Spring Cloud与Spring Boot的版本兼容性

Spring Boot3.x对应的Spring Cloud版本是2022.0.x(代号Kyoto),而Spring Cloud Netflix的组件(包括Eureka)对版本匹配要求很严格,如果你的项目没有统一管理Spring Cloud的版本,很容易出现依赖冲突,间接引发这个类找不到的问题。

建议在你的pom.xml中添加Spring Cloud的依赖管理节点,强制统一所有Spring Cloud组件的版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2022.0.5</version> <!-- 这是Spring Boot3.x兼容的稳定版本 -->
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. 排查jakarta.inject-api的依赖状态

你已经添加了jakarta.inject-api依赖,但有可能它被其他依赖排除了,或者没有正确引入到项目中。可以执行下面的Maven命令查看依赖树:

mvn dependency:tree | grep jakarta.inject

如果输出里看不到jakarta.inject:jakarta.inject-api:2.0.1,说明这个依赖没有被正确引入,或者被其他依赖排除了。这时候你可以在自己的依赖节点里明确声明,确保它被加载:

<dependency>
    <groupId>jakarta.inject</groupId>
    <artifactId>jakarta.inject-api</artifactId>
    <version>2.0.1</version>
    <scope>compile</scope> <!-- 显式声明compile范围,避免被覆盖 -->
</dependency>

3. 清理Maven缓存并重新构建

有时候本地Maven仓库的缓存会导致依赖没有正确更新,即使你执行了mvn clean install也没用。可以试试这两步:

  • 执行mvn clean install -U-U参数会强制Maven更新所有快照和依赖
  • 手动删除本地Maven仓库中jakarta/inject相关的目录(比如~/.m2/repository/jakarta/inject),然后重新执行构建命令,确保依赖是全新下载的

4. 确保Eureka Client依赖的正确性

不要手动引入零散的Eureka组件依赖,直接用Spring Cloud提供的starter依赖,它会自动管理所有必要的传递依赖,避免遗漏:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

另外补充一点:Spring Boot3.x全面从javax迁移到了jakarta命名空间,所以你的项目里绝对不能有任何旧的javax.inject相关依赖,如果有的话会直接引发冲突,用mvn dependency:tree | grep javax.inject排查一下,如果有就排除掉。

内容来源于stack exchange

火山引擎 最新活动