我想更新一个用maven构建的spring应用程序,从java 8到java 17,但由于java平台模块系统,我得到了以下例外:Unable to make field private byte[] javax.crypto.spec.SecretKeySpec.key accessible: module java.base does not "opens javax.crypto.spec" to unnamed module @234523ab
.
正如我在以前的帖子中所读到的,我试图通过在我的pom.xml
文件中添加以下插件来打开包javax.crypto.spec
到所有未命名的模块:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>@{argLine}
--add-opens java.base/javax.crypto.spec=ALL-UNNAMED
</argLine>
</configuration>
</plugin>
然而,我仍然得到相同的异常。有人知道如何在maven spring应用程序中解决这个问题吗?此外,我读到--add-opens
应该只用作一种变通方法,所以有人知道更好的解决方案吗?虽然通常不推荐,但可以通过使用不安全反射直接更改内存来访问字段。
public static void forceAccessible(AccessibleObject ao) {
try {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
((Unsafe) unsafeField.get(null)).putBoolean(ao, 12, true);
} catch (IllegalAccessException|NoSuchFieldException e) {
e.printStackTrace();
}
}
这段代码使用不安全反射来更改字段"override"的值。直接在内存中。该字段决定该字段是否可访问。