An illegal reflective access operation has occurred警告

问题描述

今天 在 install Maven项目的时候,控制台出现警告如下:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/E:/DevelopmentKit/Maven/install-location/apache-maven-3.8.1-bin/localRepository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar) to field java.util.Properties.defaults
WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields
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

字面意思说的是发生的了一个非法的反射访问操作,警告发生的地方是:

 从com.thoughtworks.xstream.core.util.Fields (file:/E:/DevelopmentKit/Maven/install-location/apache-maven-3.8.1-bin/localRepository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar) 到 field java.util.Properties.defaults存在非法的反射访问。

问题分析

想了很久也没有弄明白是什么原因导致了控制台输出了这个警告,后面在网上查了查资料,发现是这么一回事:在JDK 9之前 ,Java允许通过反射机制访问所有的成员,这些成员的类型包括私有(private),公共(public),包(< package >)和受保护(protected)JDK9新增的功能之一 —— 模块系统对反射的行为做出了一定的限制

JDK9开始,对于非公有的成员、成员方法和构造方法,模块不能通过反射直接去访问,但是JDK9提供了一个可选的修饰符open来声明一个开放模块,可以从一个开放模块中导出所有的包,以便在运行时对该模块中的所有包中的所有类型进行深层反射来访问。

在JDK9中,Java运行时由一个一个的模块组成。基于旧版本JDK开发的第三方jar包在迁移到JDK9时无法被转换成为模块,但是可以将其放在类路径下,被加载成为一个unnamed标识的模块,如果该模块存在被使用的需求,则会被放置在模块路径上,被加载后用作自动模块,进而被系统依赖使用。

问题解决

从上面的分析可以知道,处理该警告的解决方法主要存在以下两种:
方案一:将JDK切换成旧版本的。(我这里使用的是JDK11出现了这个问题,将JDK11降级成JDK8之后警告就消失了)

具体操作:
1.打开项目结构
2.做出以下修改。
在这里插入图片描述
在这里插入图片描述
3.点击保存

方案二:使用 --illegal-access 参数

其实这个参数在控制台输出的信息中已经给出了,如下

WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations

其常用的参数值如下:

  • permit 默认行为,允许通过反射进行访问。当第一次尝试通过反射进行非法访问时会生成一个警告,之后不会再进行警告。

  • warn 与permit相同,但每次非法访问时都会产生警告。其大致等效于 “–permit-illegal-access”。

  • debug 每次非法访问产生警告的同时打印非法访问的堆栈跟踪信息。

  • deny 不允许所有的非法访问操作,除了启用其它命令行参数排除的模块,例如"–add-opens",这个参数可以参数将某些模块排除出来,让它们能够通过非法反射进行访问。

为了消除警告并继续使用需要进行非法访问的模块,可以将参数 --illegal-access的值设置为deny并使用一个或多个`–add opens 来打开对应的模块允许对其进行非法反射访问。

具体的做法如下:

①点击settings 并打开到如下的页面。
在这里插入图片描述
②修改完成后点击OK。

要注意的是 :

参数 --add-opens  java.base/java.base模块内的jar包名 = ALL-UNNAMED 

java.base模块内的jar包有很多,比如java.lang、java.util等等
具体包括哪些,可以参考这篇博客:https://blog.csdn.net/ixiaoyang/article/details/103814792

笔者根据控制台的警告信息,在"java.base模块内的jar包名"处填写的是 java.util.Properties.defaults包在java.base模块内对应的jar包,即 java.util包(感觉这样会比较保险),当然填写其他的好像也可以(前提是在java.base模块内,但是没弄懂具体是什么回事)。.

如果指定的包不在java.base模块内,控制台会输出如下的警告:
在这里插入图片描述

参考:

[1]http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-June/012841.html
[2]https://www.cnblogs.com/lujiango/p/7852120.html

<think>好的,我现在需要解决用户关于Jenkins出现“非法反射访问操作”警告的问题。用户提到的是Java的反射访问警告,这通常发生在使用较新版本的Java运行旧版本的库或代码时。首先,我需要回忆一下Java 9引入的模块化系统,因为这个问题通常与模块系统的访问限制有关。 首先,用户可能使用的是Java 11或更高版本运行Jenkins,而Jenkins的某些插件或依赖可能没有更新到兼容的版本。这时候,Java会抛出这样的警告,提示有代码通过反射访问了内部API,这在未来的版本中可能会被禁止。 接下来,我需要考虑常见的解决方案。通常,解决方法包括升级Jenkins到最新版本,因为新版本可能已经修复了这些兼容性问题。另外,检查插件是否更新也很重要,因为过时的插件可能依赖旧库。如果升级后问题依旧,可能需要调整Java的启动参数,比如添加`--add-opens`来允许特定的模块被反射访问。 还要考虑用户的环境,比如他们使用的Jenkins版本、Java版本以及具体的警告信息内容。不同的警告可能需要不同的模块开放。例如,如果警告涉及`java.base/java.lang`,那么对应的启动参数应该是`--add-opens java.base/java.lang=ALL-UNNAMED`。 此外,用户可能需要检查是否有自定义的插件或脚本导致这个问题。如果是内部开发的插件,可能需要修改代码以避免使用反射访问内部API。不过,对于大多数用户来说,更实际的方法可能是通过调整JVM参数来暂时抑制警告,同时等待官方更新。 最后,需要提醒用户,虽然添加JVM参数可以解决警告,但这只是一个临时措施,长期解决方案还是需要升级到修复后的版本。同时,注意不要随意开放所有模块,以免带来安全风险。 总结步骤应该是:1. 升级Jenkins;2. 更新所有插件;3. 添加必要的JVM参数;4. 检查自定义代码或插件。如果用户无法立即升级,提供具体的启动参数示例会很有帮助。另外,参考信息中的ZOOKEEPER相关问题可能不直接相关,但说明软件更新常解决此类兼容性问题,可以引用作为类似情况的处理方式。</think>### Jenkins 'illegal reflective access operation' 警告解决方案 Jenkins 在启动或运行时出现 `illegal reflective access operation` 警告,通常是由于 Java 9+ 模块系统对反射操作的限制引起的[^1]。以下是分步解决方案: --- #### **1. 升级 Jenkins 及插件** - **原因**:旧版 Jenkins 或插件可能使用了不兼容新 Java 版本的反射操作。 - **操作**: 1. 升级 Jenkins 到最新长期支持版(LTS)。 2. 在 Jenkins 管理界面更新所有插件。 - **示例命令**(通过 Docker): ```bash docker pull jenkins/jenkins:lts ``` --- #### **2. 调整 JVM 启动参数** - **原因**:通过开放特定模块权限,临时允许反射访问。 - **操作**: 修改 Jenkins 启动脚本(如 `jenkins.sh` 或 `systemd` 服务文件),添加以下参数: ```bash JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED" ``` - **注意**:需根据具体警告内容调整模块名(如 `java.base/java.io`)。 --- #### **3. 降级 Java 版本(临时方案)** - **原因**:Java 8 无模块系统限制,但长期不推荐。 - **操作**: 安装 Java 8 并配置 Jenkins 使用: ```bash sudo update-alternatives --config java # 选择 Java 8 ``` --- #### **4. 检查自定义插件或脚本** - **原因**:自行开发的插件可能包含非法反射代码。 - **操作**: 1. 使用 `mvn dependency:tree` 检查依赖冲突。 2. 替换或更新使用 `sun.*` 等内部 API 的代码。 --- #### **总结** | 方案 | 适用场景 | 优先级 | |--------------|---------------------------|--------| | 升级 Jenkins | 官方已修复兼容性问题 | 高 | | 调整 JVM 参数| 临时解决警告 | 中 | | 降级 Java | 紧急情况下短期使用 | 低 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值