最近想将一些项目升级到springboot3.x和java17的时候,发现项目依赖中有Jakarta的包,但是代码标红提示没有相关的类,特此记录一下排查问题和最终解决问题的思路方法
一、发现问题
因为之前有创建过 springboot3.x + java17 的项目,也运行正常。所以最近想着将一些旧项目也做一下update,但是不幸运的是,当改了一通代码后编译的时候,提示 "程序包jakarta.annotation不存在"。
下图看到 Resource 注解是标红提示没有找到。
之前也知道Java EE要迁移到Jakarta EE,也对整个项目的相关代码进行了修改,但是为什么还会提示有异常呢?
二、分析问题
1.依赖引入
首先考虑的肯定是对应的包是否已经引入进来,于是查看了项目的依赖
依赖里面明明是有的,为什么还是提示没有这个注解类呢?
于是 mvn clean、ide清缓存索引等等一波操作后,仍是无果....
2.发现问题点
后来看了一下项目配置,看了一下这里面的依赖,好家伙,作用域scope居然是test...
那为什么作用域会是测试阶段的呢?
3.查看依赖关系
那就看看到底是从哪里引入进来的
通过依赖分析工具,查到原来是从 spring-boot-starter-test 引入进来的,而项目中这个依赖的作用域确实是 test
那问题来了,为什么之前的项目就可以的呢?不过这个 jakarta 包不应该是从测试依赖导入进来的啊!
4.对比分析
于是对比了一下之前运行正常的项目,看看这个 jakarta 包是如何正常引入进来运行的。
好家伙,原来是从 spring-boot-starter-web 引入进来的,同时也看看其他的几个 jakarta 包。
真的不看不知道,平常真没怎么注意到这里面的依赖学问,因为自从用了 springboot 的 starter ,就真的很少关注到这些问题。
三、解决问题
要调整的这个项目里面因为是要打成jar包给其他项目使用,所以我就不想引入太多依赖包,就没有引入 starter,只是单纯的引入了 spring-web 这个包,但是这里面并没有 jakarta 依赖,而刚好项目里面又引入了一些单元测试用的依赖,所以阴差阳错就将 jakarta 以 test 作用域引入进来了...
所以,最终还是要引入 spring-boot-starter-web...
四、后续
通过查阅一些资料发现,原来 Java 17 已经不包括 jarkarta 模块...
在 Java 17 中,Jakarta EE 被移除,取而代之的是引入了 Java EE 的一部分作为扩展模块。要在 Java 17 中使用 Java EE 的功能,你需要在项目的 pom.xml 文件中添加相应的依赖