我正在尝试使用 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
有人知道我为什么收到这条消息吗?
要消除这些警告,您需要在启动脚本中使用以下选项:
--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 启动脚本中看到的那样。
警告的修复不太可能很快得到解决:
有计划在未来的版本中解决这些问题吗?
目前还没有。
我们将尽可能长时间地保持明确的清理。一旦它 被永久阻止,我们可能不得不依赖这样一个事实: 有问题的 Maps 使用 WeakReference 并等待 GC 清除 参考。这将使追踪真正的内存泄漏变得更加困难 所以我们必须看看是否可以说服 JRE 团队提供一些 如果/当我们达到这一点时,某种替代 API。