1.问题异常:
java: 程序包javax.annotation不存在。
2.发生背景:
项目使用jdk版本做了升级,升级到了jdk19。结果切换了以后项目编译就报错了,报错信息就是上述的:java: 程序包javax.annotation不存在。
3.报错原因:
经过排查查询资料发现,原来,在jdk版本迭代中,在jdk9中javax.annotation被删除了。
也就是说Java EE modules中的java.xml.bind (JAXB),从jdk9开始不建议使用,在jdk11中就直接将该部分删除。可以通过使用Java EE技术的替代版本来解决此问题。只需添加包含所需类的Maven依赖项。
4.解决方案:
综上所述,其实解决方案有如下几种:
1>. J2EE已在Java 9中弃用 @PostConstruct
和@PreDestroy
这两个注解 ,并计划在Java 11中将其删除。
2>. 手动添加依赖项可解决:
<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;@Singletonpublic class MyBean {@PostConstructpublic void postConstructMethod() {// 初始化逻辑}@PreDestroypublic void preDestroyMethod() {// 清理逻辑}}