WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by net.sf.cglib.core.ReflectUtils$2 (file:/C:/Users/86195/.m2/repository/cglib/cglib/3.1/cglib-3.1.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 net.sf.cglib.core.ReflectUtils$2 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
时间: 2025-06-18 13:49:33 浏览: 3
### 解决方案
#### Maven 编译错误分析
在 JDK 21 中运行 Spring Boot 项目时遇到 `java.lang.NoSuchFieldError` 错误,表明当前使用的工具链版本不兼容。具体来说,`com.sun.tools.javac.tree.JCTree$JCImport` 类中不存在名为 `qualid` 的字段[^1]。
此问题通常发生在以下场景之一:
- 使用的 Java 版本与编译器插件(如 maven-compiler-plugin)配置不匹配。
- 工具链中的某些组件依赖于旧版内部 API,而这些 API 在较新的 JDK 版本中已被移除或更改。
为了修复该问题,可以采取以下措施:
---
#### 配置 Maven Compiler 插件
确保项目的 `pom.xml` 文件中正确设置了编译目标版本和源码版本。如果未设置,则默认可能使用较低版本的 Java,从而引发兼容性问题。以下是推荐的配置方式:
```xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version> <!-- 推荐升级到最新稳定版本 -->
<configuration>
<source>21</source>
<target>21</target>
<release>21</release> <!-- 可选:指定 release 参数简化配置 -->
</configuration>
</plugin>
</plugins>
</build>
```
注意:虽然引用提到的是 `maven-compiler-plugin:3.8.1`[^2],但建议将其更新至更高版本(如 3.10.x),因为新版本对现代 JDK 提供更好的支持。
---
#### 处理 CGLIB 和非法反射访问警告
CGLIB 是一种常用的字节码操作库,但在高版本 JDK 下可能会触发 **illegal reflective access** 警告。这是因为自 JDK 9 开始引入模块化系统(Project Jigsaw),许多以前公开的内部类被封装起来,无法通过反射直接访问。
要解决这一问题,可以通过以下方法处理:
1. **启用 JVM 参数允许反射访问**
如果暂时不想修改代码逻辑,可以在启动命令中加入如下参数以忽略非法反射访问警告:
```bash
--add-opens java.base/java.lang=ALL-UNNAMED
```
对应的完整启动脚本示例如下:
```bash
java --add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.util=ALL-UNNAMED \
-jar your-springboot-app.jar
```
2. **升级 CGLIB 到最新版本**
确保项目中使用的 CGLIB 库是最新的(目前最新版本为 3.4.x)。低版本的 CGLIB 更容易因依赖内部 API 导致兼容性问题。在 `pom.xml` 中添加/更新以下依赖项:
```xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.4.0</version>
</dependency>
```
3. **替换 CGLIB 为其他替代品**
如果条件允许,考虑迁移到更现代化的字节码增强框架,比如 ByteBuddy 或 ASM。它们提供了更高的性能以及更好的 JDK 兼容性。
---
#### 完整解决方案总结
综合以上内容,完整的解决方案包括以下几个方面:
1. 升级 `maven-compiler-plugin` 至最新版本并调整其配置以适配 JDK 21。
2. 添加必要的 JVM 启动参数来规避非法反射访问警告。
3. 更新 CGLIB 库至最新版本,或者评估迁移至其他替代框架的可能性。
最终的 `pom.xml` 示例配置如下:
```xml
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<release>21</release>
</configuration>
</plugin>
</plugins>
</build>
```
---
###
阅读全文
相关推荐












