繁体   English   中英

org.springframework.cglib.core.ReflectUtils$1 的非法反射访问

[英]Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1

我的 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处理不同库中的类似症状。

在 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+ 提供了此问题的修复程序。

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

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

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

我的出路需要两件事:

  • Jan 提到的--add-opens添加到您的运行/调试配置中。 只需编辑配置并查看环境/VM 选项。 这负责使一些“非法访问消息”静音。

  • 我还需要向jaxb-api库添加依赖项。 我从 ValentinBossi 对this spring github issue 的评论中得到了提示。

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

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

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

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

这对我有帮助!!

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

  • 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 启动的,或者是使用特殊的类加载器启动的,则它被视为“生产应用程序”

因此,人们可以预期,当从命令行启动应用程序时,警告应该会消失(我还没有验证过)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM