如何解决SpringBoot2.1缺少Java11依赖项问题

本文详细介绍了如何解决JDK11与SpringBoot的兼容性问题,包括删除旧版本、使用正确JDK创建项目及测试方法,帮助读者避免因依赖包缺失导致的启动失败。

前言

研究了几个星期问题,终于解决了。
Java 11从JDK中剔除了很多JRE的东西,但事实并非如此。
在网上仅仅只找到一点关于jdk11和spring boot的支持问题的资料:jdk11与springboot的依赖。不过仍然没解决问题,这篇文章将实际帮你解决这个springboot留下的问题。

简单解释一下为什么会出现这个问题:
jdk11从jdk中剔除了很多jre的东西,导致idea在自动下载时没有下载那部分依赖包,springboot根本无法启动。
欢迎收藏米奇罗的博客

1. 准备&注意事项

有几个注意事项:

  • 项目在IDEA运行。
  • 请勿让IDEA下载太多的Spring boot版本,放在一起容易出问题,一般存放位置在C盘的用户里面.m2文件夹就是springboot存放位置,可以将其删除,创建项目的时候,选择版本,IDEA会自动帮你下载。
  • 因为JAVA官网已经不再支持jdk11的下载了,我这儿有网盘下载jdk10的下载提取码: e548
  • jdk11官网下载

2. 解决方法

在idea中jdk11在配置springboot时所缺少的几个依赖包,在jdk10版本下下载的springboot2.1.0中就可以找到了。

第一步:删除之前IDEA下载的所有springboot版本

在C盘用户目录下.m文件夹就是下载的springboot版本,直接把文件夹删掉即可。

第二步:用IDEA新建Spring Initializr 项目

利用jdk10来下载所缺的依赖包
这个时候必须使用jdk10来创建项目(利用Spring Initializr创建)

利用Spring Initializr创建

红色位置不能错
在这里插入图片描述

在这里插入图片描述
其他默认创建即可。

第三步:直接使用jdk11创建项目

和上面步骤大致一样,jdk版本选择11即可。

第四步:创建HelloController.java测试

如图创建测试代码HelloController.java

package com.example.demo07;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController;

/**
 * 这里的@RestController   相当于@ResponseBody + @Controller
 */
@RestController
public class HelloController {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String helloSpringBoot(){
        return "Hello SpringBoot!";
    }
}

在这里插入图片描述

接下来就是见证奇迹的时刻,直接点击运行,在浏览器中输入http://localhost:8080/hello
结果如下:
结果

3. 小结&参考资料

小结

对于强迫症的我来说,一直连续弄了几周,皇天不负有心人,终于找到了解决方法,心情是无比激动啊,然后就翘了一节课。

参考资料

<think>好的,我现在需要解决用户遇到的Spring Boot项目中的IllegalArgumentException问题,具体错误是关于无法实例化DependsOnDatabaseInitializationDetector和MybatisDependsOnDatabaseInitializationDetector。用户之前已经得到了一些解决方案,但可能问题还未完全解决,或者他们需要更详细的指导。现在我要结合用户提供的引用信息和之前的回答来思考解决方案。 首先,回顾用户的问题,错误信息显示在Spring Boot 2.6.13中,MyBatis的自动配置类无法被实例化。可能的原因包括依赖版本不兼容、配置缺失或依赖冲突。用户提供的引用中提到了ApplicationContext的关闭钩子、MessageSource配置、ThemeSource实现、线程本地化以及事务拦截器,但这些可能和当前问题关联不大,但需要确保这些配置不会干扰到数据库初始化的检测。 根据之前的回答,重点检查MyBatis依赖版本是否与Spring Boot兼容。用户提到使用spring-boot-2.6.13,因此需要确认mybatis-spring-boot-starter的版本是否匹配。根据Spring Boot的官方文档,2.6.x版本对应的MyBatis Starter应该是2.2.x或更高版本。如果用户使用的是旧版本,比如2.1.x,可能会导致类路径中缺少必要的类,从而引发实例化异常。 接下来,检查是否有依赖冲突。用户可能引入了其他库,这些库可能传递依赖了不同版本的Spring或MyBatis,导致冲突。例如,某些旧版本的库可能引用了spring-core的老版本,而Spring Boot 2.6.13需要特定版本的spring-core。使用Maven的dependency:tree命令可以帮助识别冲突,并排除不需要的依赖。 另外,用户提供的引用[4]提到了线程本地化的正确使用,虽然这可能与当前问题无直接关联,但需要确保在多模块项目中,数据库初始化的顺序正确。例如,生产者模块(如数据源配置)应在消费者模块之前初始化,避免因依赖顺序问题导致组件加载失败。 用户还提到了@MapperScan注解,这用于指定MyBatis的Mapper接口路径,确保Spring能正确扫描并注册这些Bean。如果配置不正确,可能导致MyBatis相关的自动配置类无法正确加载,从而引发错误。 此外,清理构建缓存也是一个重要步骤。有时候,旧的依赖项可能残留在缓存中,导致即使更新了pom.xml文件,实际使用的仍是旧版本的库。执行mvn clean install -U可以强制更新依赖,确保所有库都是最新的。 现在,结合用户提供的引用,虽然大部分是关于ApplicationContext和配置的,但需要确保这些配置不会干扰数据库初始化检测。例如,检查是否有自定义的ThemeSource或MessageSource配置,导致上下文加载顺序异常。但可能性较低,主要还是关注MyBatis依赖和版本问题。 最后,验证解决方案是否有效。建议用户更新依赖后,重新构建项目,并检查是否仍然出现相同的异常。如果问题依旧,可能需要进一步分析依赖树,或查看是否有其他自动配置类冲突。</think>#### 分步解决方案:MyBatis依赖与Spring Boot 2.6.13兼容性问题修复 --- ### **1. 核心问题定位** 错误根本原因是$MybatisDependsOnDatabaseInitializationDetector$类未正确实现$DependsOnDatabaseInitializationDetector$接口,或依赖版本不兼容导致类加载失败。 验证公式: $$ \exists v \in [2.2.0, 3.0.0) \quad s.t. \quad \text{mybatis-spring-boot-starter}(v) \propto \text{spring-boot-2.6.13} $$ (需存在2.2.0≤版本<3.0.0的MyBatis Starter与Spring Boot 2.6.13兼容) --- ### **2. 依赖版本强制锁定** 在$pom.xml$中显式指定兼容版本组合: ```xml <properties> <mybatis-spring-boot.version>2.2.0</mybatis-spring-boot.version> <spring-boot.version>2.6.13</spring-boot.version> </properties> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot.version}</version> <!-- 排除冲突的Spring核心组件 --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </exclusion> </exclusions> </dependency> ``` 通过$mvn dependency:tree -Dincludes=org.springframework:spring-jdbc$验证排除效果[^1] --- ### **3. 类路径完整性验证** 检查是否包含关键类文件: ```bash # 检查MyBatis检测器类是否存在 jar tf mybatis-spring-boot-autoconfigure-2.2.0.jar | grep MybatisDependsOnDatabaseInitializationDetector # 验证Spring Boot检测器接口 jar tf spring-boot-2.6.13.jar | grep DependsOnDatabaseInitializationDetector ``` 若输出为空,说明存在JAR包损坏或版本错误,需重新下载依赖 --- ### **4. 初始化顺序控制(多模块项目)** 对于依赖数据库初始化的模块,在$application.properties$中配置: ```properties # 确保数据源先于MyBatis初始化 spring.sql.init.mode=always spring.datasource.initialization-order=1 mybatis.initialization-order=2 ``` 初始化顺序需满足: $$ \text{DataSource} \prec \text{MyBatis} \prec \text{Business Components} $$ --- ### **5. 运行时调试配置** 在IDEA中增加JVM参数捕获类加载信息: ```ini -Dorg.springframework.boot.sql.init.dependency.logging=TRACE -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true ``` 通过日志观察$DependsOnDatabaseInitializationDetector$实例化过程,确认是否成功加载MyBatis实现类[^4] --- ### **6. 替代方案:自定义检测器** 若问题仍未解决,可手动实现检测器(临时方案): ```java @Configuration public class MybatisInitializationConfig { @Bean public DependsOnDatabaseInitializationDetector mybatisDetector() { return new AbstractDependsOnDatabaseInitializationDetector() { @Override public boolean detect(Class<?> beanClass) { return beanClass.isAnnotationPresent(Mapper.class); } }; } } ``` 在$@SpringBootApplication$主类上添加$@Import(MybatisInitializationConfig.class)$ --- ### **验证流程** 1. 执行$mvn clean install -U$ 2. 检查构建日志中MyBatis版本是否符合要求 3. 运行应用并观察启动日志中是否出现$Registered detector 'mybatis'$条目 4. 使用$curl http://localhost:8080/actuator/beans$确认Bean加载顺序 --- ### 相关问题 1. 如何通过Spring Boot Actuator监控数据库初始化状态? 2. 在多数据源配置下如何调整MyBatis初始化顺序? 3. 使用Gradle时如何排除特定传递依赖? 4. Spring Boot 2.x与3.x在数据库初始化机制上有何区别?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值