切换到Java 17后出现了“未识别的VM选项'CMSClassUnloadingEnabled'”的错误提示。

16

将Java版本更改为17后,我无法构建Gradle项目。

我正在使用Gradle 7.3.1版本,并在Gradle属性中有以下行:

org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xms1g -Xmx4g -XX:+UseG1GC -XX:+CMSClassUnloadingEnabled

然后我遇到了以下错误
Unrecognized VM option 'CMSClassUnloadingEnabled'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

如果我移除了-XX:+CMSClassUnloadingEnabled,那么我会得到这个错误:
Unable to make field private int java.lang.reflect.Field.modifiers accessible: module java.base does not "opens java.lang.reflect" to unnamed module @1b9ee3e0

11
“未识别的VM选项'CMSClassUnloadingEnabled'”的出现是因为在Java 14中删除了CMS垃圾收集器,并且针对该垃圾收集器的特定选项(如“CMSClassUnloadingEnabled”)在Java 14及更高版本中被视为非法。如果您添加此选项,JVM将拒绝启动。” - Thomas Kläger
4
第二个错误是“无法使私有的int java.lang.reflect.Field.modifiers字段可访问”,这是因为Java 17大幅限制了对内部字段的访问。然而,由于Gradle 7.3与Java 17兼容,所以这必须是某个第三方插件或者你的代码报告的错误。在没有进一步的上下文信息的情况下,无法确定具体原因。 - Thomas Kläger
是的,你说得对,那是因为AspectJ。 - Wiktor Kęska
5
一个典型的神秘命令行选项案例。选项“-XX:+CMSClassUnloadingEnabled”是特定于CMS垃圾收集器的,因此与完全不同的垃圾收集器“-XX:+UseG1GC”结合使用从未有任何意义。现在,由于CMS收集器已被删除,与CMS相关的选项会导致错误,但是当您使用G1GC时,这些选项根本没有任何影响。由于G1GC是JDK 17的默认设置,因此您甚至可以删除“-XX:+UseG1GC”选项。 - Holger
1个回答

0
Unable to make field private int java.lang.reflect.Field.modifiers accessible:
module java.base does not "opens java.lang.reflect" to unnamed module @1b9ee3e0
是的,这是由于AspectJ。
假设您正在使用AspectJ的加载时织入(LTW),而不是编译时织入,也许您应该阅读自1.9.7版本以来的每个版本的AspectJ发布说明,支持Java 16+:

在Java 16+上使用LTW

请注意,如果您想在Java 16+上使用加载时织入,编织代理与JEP 396(默认强封装JDK内部)及相关后续JEP发生冲突。因此,您需要设置JVM参数--add-opens java.base/java.lang=ALL-UNNAMED以启用切面织入。这是因为编织器在定义不同类加载器中的类时使用了内部API,我们尚未找到适当的替代方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接