簡體   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