前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Stream-Query兼容JDK17

Stream-Query兼容JDK17

作者头像
用户10136162
发布2023-11-07 10:27:14
2490
发布2023-11-07 10:27:14
举报
文章被收录于专栏:Eliauk的小窝

1、升级之后的问题

在升级到JDK17的过程中遇到了一些问题 1、比如在设置属性可修改时碰到了一些问题

代码语言:javascript
复制
/**
   * return accessible accessibleObject
   *
   * @param accessibleObject accessibleObject method
   * @param <$ACCESSIBLE_OBJECT> a $ACCESSIBLE_OBJECT class
   * @return accessibleObject
   */
  public static <$ACCESSIBLE_OBJECT extends AccessibleObject> $ACCESSIBLE_OBJECT accessible(
      $ACCESSIBLE_OBJECT accessibleObject) {
    if (accessibleObject.isAccessible()) {
      return accessibleObject;
    }
    return AccessController.doPrivileged(
        (PrivilegedAction<$ACCESSIBLE_OBJECT>)
            () -> {
              accessibleObject.setAccessible(true);
              return accessibleObject;
            });
  }

上述是源代码,然后产生的问题是

代码语言:javascript
复制
java.lang.reflect.InaccessibleObjectException: Unable to make field private static final long java.lang.invoke.MethodType.serialVersionUID accessible: module java.base does not "opens java.lang.invoke" to unnamed module @6cc4c815

在网上查阅资料得知是因为在jkd9版本及以上版本中,Java平台模块化系统(JPMS)引入了更严格的访问控制。即使通过反射API调用setAccessible(true)试图强制访问某个类的私有成员, 如果包含该成员的模块没有显式地向调用者模块开放(opens)相应的包,那么尝试访问该成员时将会抛出IllegalAccessException。

2、解决

1、来自(CSDN)

在网上(CSDN)看到了好多说什么把JDK版本降到8就解决了(好像在脱了裤子放屁一样)

2、一些正确的可用的解决方法

网上有一种临时解决办法就是在项目启动的jvm参数中设置以下参数

代码语言:javascript
复制
--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED

但是作为一个开源项目不能让使用的用户每次启动项目都去手动设置JVM参数,如果这样的化那这个开源项目基本就没人使用了

3、最终解决办法(全自动,可靠,兼容多版本)

1、添加属性

为了适配多版本需要使用properties属性

代码语言:javascript
复制
<properties>
        <surefire.argLine></surefire.argLine>
</properties>

添加属性,然后根据JDK的版本去添加对应的数据

2、使用属性

引入maven插件

代码语言:javascript
复制
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <testFailureIgnore>true</testFailureIgnore>
        <!-- 使用属性值来配置argLine -->
        <argLine>${surefire.argLine}</argLine>
    </configuration>
</plugin>
3、动态修改启动参数
代码语言:javascript
复制
<profile>
    <!-- 这个profile在Java 8或更高版本时激活 -->
    <id>java8+</id>
    <activation>
        <jdk>[8,)</jdk>
    </activation>
    <properties>
        <!-- 重写argLine属性为Java 8+的配置 -->
        <surefire.argLine>--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED</surefire.argLine>
    </properties>
</profile>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、升级之后的问题
  • 2、解决
    • 1、来自(CSDN)
      • 2、一些正确的可用的解决方法
        • 3、最终解决办法(全自动,可靠,兼容多版本)
          • 1、添加属性
          • 2、使用属性
          • 3、动态修改启动参数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档