终究还是要升级的,最近给网站服务器jdk升级到了13,主要原因还是最新的jdk实现了JSSE SSL/TLS安全套接字,可以在Tomcat上直接调用JSSE SSL/TLS安全套接字的实现升级成HTTP2协议连接传输通信。具体细节另说,后续补充Tomcat升级HTTP2协议连接教程。
升级完成后发现网站的全文检索发现报错,通过抓取到的错误日志如下:
Caused by: java.lang.IllegalAccessException: class org.apache.lucene.store.MMapDirectory$2$1 cannot access class jdk.internal.ref.Cleaner (in module java.base) because module java.base does not export jdk.internal.ref to unnamed module @2c99419f at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376) at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:642) at java.base/java.lang.reflect.Method.invoke(Method.java:559) at org.apache.lucene.store.MMapDirectory$2$1.run(MMapDirectory.java:322) at org.apache.lucene.store.MMapDirectory$2$1.run(MMapDirectory.java:314) at java.base/java.security.AccessController.doPrivileged(AccessController.java:554) at org.apache.lucene.store.MMapDirectory$2.freeBuffer(MMapDirectory.java:314) ... 71 more
大概的意思是jdk13的java.base模块未将jdk.internal.ref导出到未命名的模块,从而没能正常加载 jdk.internal.ref.Cleaner类。
可以通过配置jdk启动参数解决这个问题,我们修改Tomcat的bin目录下的catalina.sh文件,为JAVA_OPTS增加如下配置:
JAVA_OPTS="$JAVA_OPTS --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED"
重启Tomcat服务,查询Tomcat进程看看相关参数是否已配置成功:
[tomcat@** tomcat9]# ps -ef|grep tomcat tomcat **** 1 35 20:38 pts/0 00:00:19 **/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED **
发现tomcat进程打印的日志中已正确加载该参数,全文检索报错的问题至此得到解决。查询网上有资料说将lucene升级到版本6亦可解决这个问题,留存待测吧。
参考资料:
1.Java 9 options --add-exports vs. -XaddExports not recognized - Stack Overflow
Copyright ©2017-2024 uzen.zone
湘ICP备17013178号-3