JDK9和JDK10:NoClassDefFoundError: javax/activation/MimetypesFileTypeMap
线上服务器的版本是jdk1.7,但是很多业务都是用1.8写的,强行升级了一波,发现一个服务死了。一直报错说找不到该文件。
这个文件不是JSE自带的吗??
初步分析肯定是JDK兼容造成的。
网上找了一圈没有找到类似的案例,去git上面的issue列表看了一下,有不少同道中人,参考资料主要是三点:
- JAVA9增加了一个模块化特性,把这些JEE的模块默认都撸掉了
- 必要的情况下需要用JAVA9提供的–add-modules把这些撸掉的模块加进去
- 其中涉及到的关键知识就是root module
jse自带的模块(使用java -d java.se查询)
java.se@10.0.2
requires java.sql transitive
requires java.rmi transitive
requires java.naming transitive
requires java.datatransfer transitiv
requires java.logging transitive
requires java.xml transitive
requires java.security.sasl transiti
requires java.security.jgss transiti
requires java.scripting transitive
requires java.management transitive
requires java.desktop transitive
requires java.compiler transitive
requires java.prefs transitive
requires java.instrument transitive
requires java.sql.rowset transitive
requires java.base mandated
requires java.management.rmi transit
requires java.xml.crypto transitive
javaEE 的模块(java -d java.se.ee)
java.se.ee@10.0.2
requires java.base mandated
requires java.xml.bind transitive
requires java.transaction transitive
requires java.xml.ws transitive
requires java.activation transitive
requires java.corba transitive
requires java.xml.ws.annotation transitive
requires java.se transitive
正确的启动命令类似下面这样
java -jar –add-modules=java.activation,java.xml.bind xxxx.jar
以上可以不变更代码、不重新编译的情况下完成jdk升级兼容,改个启动命令还是风险比较小的。
上面是官方正解,其他方案很多,不要乱用,操作越骚风险越高。
pom或gradle中增加这些包的依赖
下载依赖包,导入依赖??跟上面那个没有区别吗?有区别!!!
不要升级到JAVA9以及以上