63

我的 JDK 9+181 Spring Boot 2.0.0.BUILD-SNAPSHOT CLI 应用程序在启动时显示此警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (jar:file:/home/jan/src/fm-cli/target/fm-cli-0.1.0-SNAPSHOT.jar!/BOOT-INF/lib/spring-core-5.0.0.RELEASE.jar!/) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1

这是一个控制台应用程序,所以我需要禁用此警告——我该怎么做?

注意:这个问题问的是如何禁用Spring触发的这个警告的具体问题;它不是JDK9的副本:发生了非法反射访问操作。org.python.core.PySystemState处理不同库中的类似症状。

4

7 回答 7

86

在 JDK 9+ 中,将以下选项添加到 JVM 以禁用 Spring 使用 CGLIB 的警告:

--add-opens java.base/java.lang=ALL-UNNAMED

例如:

java --add-opens java.base/java.lang=ALL-UNNAMED -jar target/*.jar

无需报告;这是一个已知的 Spring 错误

发生这种情况是因为新的 JDK 9 模块系统检测到非法访问,该非法访问将在(不久的)将来的某个时候被禁止。您可以在此处阅读有关JDK 9 模块系统的更多信息。

更新

JDK 9+ 和 Spring 5.1+ 提供了对此问题的修复。

于 2017-10-10T16:21:40.553 回答
14

这也发生在 JDK 11 和 Spring Boot 2.2.1(Spring Core 5.2.1)上。

正如对Spring Framework 问题 #22814的一些评论org.springframework.boot:spring-boot-devtools中所建议的那样,有助于删除对 的依赖。

于 2020-02-19T11:09:39.890 回答
6

添加到上面的 Jan Nielsen 答案中,如果您使用 Intellij 和 Spring Boot 2.0.3,它依赖于 Spring 核心 5.0.7,您仍然被卡住并且没有修复。

我的出路需要两件事:

  • 将Jan 提到的--add-opens添加到您的运行/调试配置中。只需编辑配置并在 Environment / VM Options 下查看。这负责消除一些“非法访问消息”。

  • 我还需要向jaxb-api库添加一个依赖项。我从 ValentinBossi 对这个春季 github 问题的评论中得到了暗示。

于 2018-06-16T00:41:17.357 回答
4

我坐在这些版本上,我仍然看到警告:

  • SpringBoot 2.4.1
  • Spring Core FW:5.3.2(我的父pom是Spring Boot的,所以这个版本是它引入的,不是我手动设置的)
  • Java openjdk版本“11.0.9.1” 2020-11-04

从 spring-boot-devtools 中删除依赖项也对我有用,启动时警告不再存在。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>

...在一天结束的时候,我只是在类路径发生任何变化时从我的 IDE 中使用自动重新启动,我可以不用它离开。然而,事情是理论上我们不应该担心它,因为根据Spring 文档

运行完全打包的应用程序时,开发人员工具会自动禁用。如果您的应用程序是使用 java -jar 启动的,或者它是使用特殊的类加载器启动的,那么它被视为“生产应用程序”</p>

因此可以预期,当应用程序从命令行启动时,警告应该会消失(我尚未验证)。

于 2020-12-28T13:17:52.280 回答
4

使用 spring 初始化器时,请确保使用最新版本的 Spring Boot。它会自动为您获取 Spring core 5.1 或更高版本,并且您在运行项目时不会看到错误。

因此,您不必担心编辑任何 JVM 配置。

于 2018-08-13T20:29:20.653 回答
3

在这些警告之后,如果您的应用程序仍然无法运行,则将此依赖项添加到您的 pom.xml

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

这对我有帮助!!

于 2018-09-06T12:45:34.217 回答
-2

如果您使用 maven 和 spring,请升级到 Spring Framework 5.1+ / Spring Boot 2.1+。

于 2021-02-04T09:06:50.323 回答