当我停止使用Tomcat 9和Java10的SpringBoot Web应用程序时,非法的反射访问

我正在尝试使用Spring Boot 2开发Java 10,但我遇到了一些问题。

该应用程序是一个基于Spring Boot 2的简单Web应用程序。应用程序启动正常,但是当我停止它时,我收到以下警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.catalina.loader.WebappClassLoaderBase (file:/C:/Users/CS/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.11/tomcat-embed-core-9.0.11.jar) to field java.io.ObjectStreamClass$Caches.localDescs
WARNING: Please consider reporting this to the maintainers of org.apache.catalina.loader.WebappClassLoaderBase
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

如您所见,我已经将嵌入的Tomcat服务器从版本8切换到9.0.11,以符合Java模块系统。应用程序通过以下选项启动--add-opens java.base/java.lang=ALL-UNNAMED

有谁知道为什么我会收到此消息?


答案 1

要使这些警告静音,您需要在启动脚本中使用以下选项:

--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

正如您在Tomcat 9启动脚本中看到的那样。

警告的修复程序不太可能很快得到解决

是否有计划在将来的版本中解决这些问题?

目前还不行。

我们将尽可能长时间地保留显式清除。一旦它被永久阻止,我们可能不得不依赖这样一个事实,即有问题的地图使用弱引用并等待GC清除引用。这将使跟踪真正的内存泄漏变得更加困难,因此我们必须看看如果/当我们达到这一点时,我们是否可以说服JRE团队提供某种替代API。


答案 2

推荐