一、第三方依赖使用了BASE64Decoder
如果项目中使用了这个类 sun.misc.BASE64Decoder,就会导致错误,因为再jdk11中,该类已经被删除。
Caused by: java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder
当然这个类也有替换方式,替换方式如下:
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
二、类文件具有错误的版本55.0,应为52.0
当项目编译或启动时,如果出现这个错误,那就是你编译的jdk版本和运行的jdk版本不一致导致的。
各个jdk对应的版本如下:
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
从上面可知,55是jdk11版本,52为jdk1.8版本。所以尝试修改编译的jdk版本和运行版本一致即可。
idea设置如下:
三、javax.xml.bind.annotation报错
jdk升级完后,项目报javax.xml.bind cannot resolve
原因:jdk11已经移除了javax.xml.bind包
解决方案:重新单独引用,以下给出两种引用方式,要看你项目是用Maven构建还是用gradle构建的项目,自己对应选择即可。
Maven引用方式:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
gradle引用方式:
dependencies {
//由于jdk11删除了java.xml.bind这个包,所以这里要手动重新引入
implementation 'javax.xml.bind:jaxb-api:2.3.0'
implementation 'com.sun.xml.bind:jaxb-core:2.3.0'
implementation 'com.sun.xml.bind:jaxb-impl:2.3.0'
implementation 'javax.activation:activation:1.1.1'
}
一些额外的知识:
关于javax.xml.bind在各个jdk版本的情况。
- jdk8:支持
- jdk9:弃用
- jdk10:弃用
- jdk11:移除
四、JDK11无法使用@Resource注解
在jdk11版本以后,javax.annotation这个包被移除了,所以无法使用@Resources。
解决办法也很简单,单独引用即可。下面是用Maven中pom文件的引用方式
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
当然了,不用这个注解也行,将@Resources注解,全部替换成@Autowired注解。