当我使用Tomcat 9和Java 10停止SpringBoot Web应用程序时,出现非法反射访问错误

14

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

该应用程序是基于Spring Boot 2的简单网络应用程序。应用程序启动正常,但当我停止它时,会出现以下警告:

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启动的。

有人知道为什么我会收到这个消息吗?


当我尝试重新构建项目以更新类路径并运行SpringBoot DevTools LiveReload时,我会得到完全相同的错误。@nullpointer,不是重复的问题。 - Onome Sotu
@OnomeSotu,你能解释一下,这与链接的另一个问题不重复的原因吗? - Naman
请使用 --add-opens java.base/java.io=ALL-UNNAMED - Johannes Kuhn
1个回答

12
为了消除这些警告,您需要在启动脚本中添加以下选项:
--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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接