1.问题异常:
java: 程序包javax.annotation不存在。
2.发生背景:
项目使用jdk版本做了升级,升级到了jdk19。结果切换了以后项目编译就报错了,报错信息就是上述的:java: 程序包javax.annotation不存在。
3.报错原因:
javax.annotation
包不存在错误通常是因为在编译 Java 项目时,编译器找不到这个包中的类。javax.annotation
包原本包含在 Java EE (Java Platform, Enterprise Edition) API 中,后来有些注解(比如 @PostConstruct
和 @PreDestroy
)被移到了 Java SE (Java Platform, Standard Edition) 中,而其他一些注解(比如 @Resource
和 @Resources
)则继续留在 Java EE 中。
4.解决方案:
综上所述,其实解决方案有如下几种:
1>. 在 Java 9 及以上版本,javax.annotation
包中的部分注解被移到了 java.platform.module-system
模块中,通过添加对应的模块依赖手动添加依赖项可解决:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
3>. 替代方案:@PostConstruct
和@PreDestroy
是用于EJB和依赖注入(DI)中的初始化和销毁逻辑。
-
@PostConstruct
:用于指定在依赖注入完成后、显示的业务逻辑执行前需要进行的初始化操作。 -
@PreDestroy
:用于指定在依赖的对象被销毁前,进行资源清理工作。
在Spring框架中,这两个注解的功能被集成到了Spring的生命周期中,并有了一些替代注解:
-
@PostConstruct
的替代:可以使用@Bean
注解的initMethod
属性。 -
@PreDestroy
的替代:可以使用@Bean
注解的destroyMethod
属性。
以下是使用这些注解的示例代码:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
@Singleton
public class MyBean {
@PostConstruct
public void postConstructMethod() {
// 初始化逻辑
}
@PreDestroy
public void preDestroyMethod() {
// 清理逻辑
}
}