1

我将 Maven 3.8.1 和 Maven surefire 插件 3.0.0-M5 与 OpenJDK 16 一起使用。.mvn/jvm.config包含--add-opens=java.base/java.lang=ALL-UNNAMED以修复以下错误:

java.lang.reflect.InaccessibleObjectException:无法使受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) 抛出 java.lang .ClassFormatError 可访问:模块 java.base 不会“打开 java.lang”到未命名的模块 @319aa9ee

为什么我需要传递-DforkCount=0给 Maven 才能使其工作?当我单独运行而不强制未分叉的 VM.mvn/jvm.config时,似乎被忽略了。mvn install有更清洁的解决方案吗?

您可以使用以下项目重现我的问题: https ://jogamp.org/cgit/ardor3d.git/

PS:问题是由 EasyMock 4.3 引起的。它在底层使用了声称支持 Java 16 的 Objenesis,它通过一些调整得到了支持,这是一个众所周知的问题。提到了 sun.misc.Unsafe,但没有提到上面的方法。

PS 2:堆栈跟踪提到尚不支持 Java 17的 cglib :

引起:org.easymock.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->无法使受保护的最终java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[] ,int,int,java.security.ProtectionDomain) 抛出 java.lang.ClassFormatError 可访问:模块 java.base 不会“打开 java.lang”到未命名的模块 @2064d52f

参考: https ://maven.apache.org/docs/3.8.1/release-notes.html#JVM_and_Command_Line_Options

4

0 回答 0