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

时间:2017-10-10 16:21:41

标签: java spring spring-boot java-9 java-module

我的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: An illegal reflective access operation has occurred. org.python.core.PySystemState的副本,它处理不同库中的类似症状。

7 个答案:

答案 0 :(得分:48)

在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

无需报告;这是一个known Spring bug

这是因为新的JDK 9模块系统检测到非法访问,将来(近)将被禁止访问。您可以阅读有关the JDK 9 Module system here的更多信息。

<强>更新

针对此问题的修复程序可以使用带有Spring 5.1 +的JDK 9+。

答案 1 :(得分:7)

在JDK 11和Spring Boot 2.2.1(Spring Core 5.2.1)上,我也遇到了这种情况。

some commentsSpring Framework issue #22814中所建议的那样,帮助消除了对org.springframework.boot:spring-boot-devtools的依赖性。

答案 2 :(得分:3)

在上面添加Jan Nielsen的答案,如果您使用的是依赖于Spring核心5.0.7的Intellij和Spring Boot 2.0.3,那么您仍然无法解决问题。

我的出路需要两件事:

  • 将Jan提到的 - add-opens 添加到您的运行/调试配置中。只需编辑配置并查看“环境/ VM选项”下的内容。这样可以消除一些“非法访问消息”。

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

我正在使用这些版本,但仍然看到警告:

  • 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 documentation

<块引用>

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

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

答案 5 :(得分:1)

这些警告之后,如果您的应用仍无法正常工作,则将此依赖项添加到pom.xml中。

<Button
android:id="@+id/button1"
android:background="@drawable/ripple"
android:text="Login"/>

这对我有帮助!

答案 6 :(得分:-1)

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