如何在Java中设置环境变量而没有“非法反射访问”?如何使用附加打开?

2024-03-08

长话短说,我必须在运行时为特定测试设置一个环境。

这里的答案工作正常,我正在使用this one https://stackoverflow.com/a/496849/4420543。问题是我收到此警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by **YOUR PACKAGE** (file: **YOUR FILE** ) to field java.util.Collections$UnmodifiableMap.m
WARNING: Please consider reporting this to the maintainers of **YOUR PACKAGE**
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

我已经开始寻找解决方案其他SO在这里回答 https://stackoverflow.com/a/35393623/4420543“解决”单元测试的问题使用相同的方法来设置环境变量。

我正在谈论这行代码 https://github.com/stefanbirkner/system-rules/blob/b319ac4a9ed349ae1887cd6634332ed8cd8f965c/src/main/java/org/junit/contrib/java/lang/system/EnvironmentVariables.java#L188来自他们的 Github 源,这会触发此错误。 (field.setAccessible(true);)

所以看起来除了设置给定的标志之外没有其他方法可以解决这个问题,就像警告所建议的那样。

然后我想知道这个警告是否严重,以及我的程序是否会在几个月内运行(我使用的是 OpenJDK 11)。它事实证明 https://stackoverflow.com/a/53800916/4420543 this illegal-access设置将在未来版本中删除。

Source https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE:

如果您必须继续使用需要非法访问的组件,那么您可以通过使用一个或多个 --add-opens 选项仅打开那些需要访问的内部包来消除警告消息。

然后后来:

要验证您的应用程序是否已为 JDK 的未来版本做好准备,请使用 --illegal-access=deny 以及任何必要的 --add-opens 选项运行它。

然后我开始寻找语法--add-opens需要但找不到如何正确使用它。

我可以找到这个,但我仍然不明白如何在 Kotlin 项目中使用它以及模块的名称是什么。

--add-打开模块/包=目标模块(,目标模块)*/

更新模块以将包打开到目标模块,无论模块声明如何。

怎么用--add-opens启用修改java.util.Collections$UnmodifiableMap.m?我可以只启用此唯一字段的附加打开还是需要将其启用到整个字段java.util.Collection?这合理吗?

实际上,我只是这样写出整个问题,因为我以非预期的方式做的过程中可能会出现问题。

感谢任何人的帮助。


根据syntax https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-7BB28E4D-99B3-4078-BDC4-FC24180CE82B for --add-opens您在上面已经引用过,您只能在包级别打开模块:

--add-opens module/package=target-module(,target-module)*

Since java.util.Collections属于java.util包来自java.base module https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collections.html,你必须添加 JVM 参数

--add-opens java.base/java.util=target-module(,target-module)*

其中您的目标模块必须是要访问的模块java.util.Collections$UnmodifiableMap.m, or ALL-UNNAMED模块。

--add-opens java.base/java.util=ALL-UNNAMED
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Java中设置环境变量而没有“非法反射访问”?如何使用附加打开? 的相关文章

随机推荐