Featured image of post 关于在 Springboot3 中 Jakarta 包无法引入的问题

关于在 Springboot3 中 Jakarta 包无法引入的问题

解决在 Springboot3 中 Jakarta 包无法引入的问题,提示程序包 jakarta.annotation 不存在

关于在 Springboot3 中 Jakarta 包无法引入的问题

最近想将一些项目升级到 springboot3.x 和 java17 的时候,发现项目依赖中有Jakarta的包,但是代码标红提示没有相关的类,特此记录一下排查问题和最终解决问题的思路方法

一、发现问题

因为之前有创建过 springboot3.x + java17 的项目,也运行正常。所以最近想着将一些旧项目也做一下update,但是不幸运的是,当改了一通代码后编译的时候,提示 “程序包 jakarta.annotation 不存在”。

springboot3_jakarta_01.png

下图看到 Resource 注解是标红提示没有找到。

springboot3_jakarta_02.png

之前也知道Java EE要迁移到Jakarta EE,也对整个项目的相关代码进行了修改,但是为什么还会提示有异常呢?

二、分析问题

1.依赖引入

首先考虑的肯定是对应的包是否已经引入进来,于是查看了项目的依赖

springboot3_jakarta_03.png

依赖里面明明是有的,为什么还是提示没有这个注解类呢?

于是 mvn clean、ide清缓存索引等等一波操作后,仍是无果….

2.发现问题点

后来看了一下项目配置,看了一下这里面的依赖,好家伙,作用域 scope 居然是test…

springboot3_jakarta_04.png

那为什么作用域会是测试阶段的呢?

3.查看依赖关系

那就看看到底是从哪里引入进来的

springboot3_jakarta_05.png

通过依赖分析工具,查到原来是从 spring-boot-starter-test 引入进来的,而项目中这个依赖的作用域确实是 test

springboot3_jakarta_06.png

那问题来了,为什么之前的项目就可以的呢?不过这个 jakarta 包不应该是从测试依赖导入进来的啊!

4.对比分析

于是对比了一下之前运行正常的项目,看看这个 jakarta 包是如何正常引入进来运行的。

springboot3_jakarta_07.png

好家伙,原来是从 spring-boot-starter-web 引入进来的,同时也看看其他的几个 jakarta 包。

springboot3_jakarta_08.png

真的不看不知道,平常真没怎么注意到这里面的依赖学问,因为自从用了 springboot 的 starter ,就真的很少关注到这些问题。

三、解决问题

要调整的这个项目里面因为是要打成jar包给其他项目使用,所以我就不想引入太多依赖包,就没有引入 starter,只是单纯的引入了 spring-web 这个包,但是这里面并没有 jakarta 依赖,而刚好项目里面又引入了一些单元测试用的依赖,所以阴差阳错就将 jakarta 以 test 作用域引入进来了…

所以,最终还是要引入 spring-boot-starter-web,不过我最后还是没妥协,只引入所需的依赖包

1
2
3
4
    <dependency>
        <groupId>jakarta.annotation</groupId>
        <artifactId>jakarta.annotation-api</artifactId>
    </dependency>

四、后续

通过查阅一些资料发现,原来 Java 17 已经不包括 jarkarta 模块…

在 Java 17 中,Jakarta EE 被移除,取而代之的是引入了 Java EE 的一部分作为扩展模块。要在 Java 17 中使用 Java EE 的功能,你需要在项目的 pom.xml 文件中添加相应的依赖

本博客所有内容无特殊标注均为大卷学长原创内容,复制请保留原文出处。
Built with Hugo
Theme Stack designed by Jimmy