一、问题
在运行环境下出现 javax.annotation ,javax.xml.bind 等找不到的情况,程序抛出异常。
二、分析及处理
jdk版本,开发环境:1.8,maven 打包环境:1.8,运行环境:11
升级jdk11后, javax.annotation ,javax.xml.bind 在jdk中被移除,在 jdk1.8下不会出现问题,部署到运行环境则抛出异常,由于开发和运行的环境不统一,以至于不能及时发现并找出问题原因,耗费很多时间和精力,下面是处理方法。
(1) javax.annotation 问题解决:
javax.annotation 下的一些类 如:PostConstruct、Resources 是一些规范的接口,jdk11中移除之后,两种情况下对应解决方案:
第一种情况,java程序运行于 web容器 下:经过分析对比,tomcat和jetty 之类的web容器的lib下面都有annotations-api 的依赖,在运行时不需要添加annotation的jar包。在开发时,如果开发环境为jdk11,可直接在pom 中添加 jakarta.annotation-api 依赖,scope 设置为provided,保证 api在编译测试时生效。 如果开发环境为java8则不影响。
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<scope>provided</scope>
</dependency>
第二种情况,java程序的运行不依赖于web容器时,单独引入annotation-api 依赖即可。
(2)javax.xml.bind 问题解决: 手动添加 jaxb-impl的一些依赖。
三、总结
目前组内Java程序的环境统一在:
IDE编译级别——Java8Maven编译打包——Java8
程序运行环境——Java11或Java8
生产环境问题梳理排查时,将开发环境与生产环境统一,能提高排查问题的效率。