KOCA 适配 Java11&Java17

总结:koca适配Java11&17的过程中,大多是因为JDK升级后移除了个别依赖,或者个别依赖是Oracle JDK 独有的。出现最多的问题在单元测试,openJDK11或17和PowerMock不兼容的问题。

KOCA 适配 Java 11

此文档写于:2022-10,所在版本:koca 3.6.0-SNAPSHOT

影响小的问题:测试用例中遇到运行不通过的问题,修改后提交即可。

影响大的问题:编译、测试、打包、安装 不兼容Java11或17的情况下,就列举出运行出错的原因及解决方法。

1. koca-base

  • koca-base 在 Java11

编译时出现的问题:

1、koca-auth-security - AbstractWebfluxAuthenticationProvider

  • 移除:
import org.omg.CORBA.UNKNOWN;  
  • 未用到此包

  • 原因:使用 jdk11,编译不通过


2、koca-bex-grpc-lib

  • 编译报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project koca-bex-grpc-lib: Compilation failure
[ERROR] /D:/koca/koca-base/koca-grpc/koca-bex-grpc-lib/target/generated-sources/protobuf/grpc-java/com/szkingdom/koca/base/grpc/GenericServiceGrpc.java:[23,18] 找不到符号
[ERROR]   符号:   类 Generated
[ERROR]   位置: 程序包 javax.annotation
  • 原因:jdk11及其以上移除了该包,可以引入 jar 替代
  • 解决方法:在该模块下的 pom 添加如下依赖:
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
</dependency>

3、koca-bex-webservice - BexSoapService WebServiceConfig BexSoapServiceImpl

  • 编译报错:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project koca-bex-webservice: Compilation failure: Compilation failure: 
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/service/BexSoapService.java:[10,17] 程序包javax.jws不存在
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/service/BexSoapService.java:[11,17] 程序包javax.jws不存在
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/service/BexSoapService.java:[19,2] 找不到符号
    [ERROR]   符号: 类 WebService
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/config/WebServiceConfig.java:[10,20] 程序包javax.xml.ws不存在
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/config/WebServiceConfig.java:[47,12] 找不到符号
    [ERROR]   符号:   类 Endpoint
    [ERROR]   位置: 类 com.szkingdom.koca.bex.webservice.config.WebServiceConfig
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/service/impl/BexSoapServiceImpl.java:[12,17] 程序包javax.jws不存在
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/service/impl/BexSoapServiceImpl.java:[33,2] 找不到符号
    [ERROR]   符号: 类 WebService
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/service/BexSoapService.java:[27,19] 找不到符号
    [ERROR]   符号:   类 WebParam
    [ERROR]   位置: 接口 com.szkingdom.koca.bex.webservice.service.BexSoapService
    [ERROR] /D:/koca/koca-base/koca-bex-parent/koca-bex-webservice/src/main/java/com/szkingdom/koca/bex/webservice/config/WebServiceConfig.java:[51,17] 无法访问javax.xml.ws.Endpoint
    [ERROR]   找不到javax.xml.ws.Endpoint的类文件
    
  • 原因:Java 11 后,JavaEE模块已经被删除,不再有 JAX-WS 模块

  • 解决方法:在 koca-bex-webservice 的 pom 中 添加 jaxws-ri 依赖

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-ri</artifactId>
    <version>2.3.3</version>
    <type>pom</type>
</dependency>
  • 由于 koca 提供的仓库里并不包含此依赖, jaxws-ri 是个 pom 文件,中央仓库没有找到对应的 jar 下载,所以先在中央仓库 mvnrepository 找到 jaxws-rt(jaxws-ri 中的一个子依赖的 jar 包),下载 jaxws-rt jar 包到本地后安装
mvn install:install-file -Dfile=D:\jars\jaxws-rt-2.3.3.jar -DgroupId=com.sun.xml.ws -DartifactId=jaxws-rt -Dversion=2.3.3 -Dpackaging=jar --settings D:\apache-maven-3.8.6\conf\settings.xml
  • 然后再到 pom 文件中添加上面的 jaxws-ri 依赖即可

4、koca-file - DiskFileUtils

  • 编译报错:DiskFileUtils 使用了 sun.misc.Cleaner ,使用 Java11 编译不通过

  • 原因:sun.misc.Cleaner 是 Oracle JDK 独有的API,openJDK 并不包含此 API

  • 解决方法:已删除 DiskFileUtils 类中包含 sun.misc.Cleaner 的相关代码

  • 扩展:sun.misc.Cleaner 是JDK内部提供的用来释放非堆内存资源的API。JVM只会帮我们自动释放堆内存资源,但是它提供了回调机制,通过这个类能方便的释放系统的其他资源。


测试出现的问题:

  • 目前 koca 使用的 powermock 版本:2.0.4, mockito 版本:3.9.0

5、koca-common-tools - CryptoUtilsTest - testEncrypt

  • 报错:
java.lang.IllegalAccessError: class javax.xml.parsers.FactoryFinder (in unnamed module @0x3e7545e8) cannot access class jdk.xml.internal.SecuritySupport (in module java.xml) because module java.xml does not export jdk.xml.internal to unnamed module @0x3e7545e8
  • 原因:powermock 和 Java11 存在版本不兼容的问题

  • 解决方法:在 @PowerMockIgnore 中补充如下:

    @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*", "org.w3c.*"})
    

6、koca-common-tools - AesCryptoAlgorithmTest - testDecrypt

  • 报错:
java.lang.IllegalAccessError: class javax.xml.parsers.FactoryFinder (in unnamed module @0x2aeefcc) cannot access class jdk.xml.internal.SecuritySupport (in module java.xml) because module java.xml does not export jdk.xml.internal to unnamed module @0x2aeefcc
  • 原因:同上
  • 解决方法:同上

7、koca-client - LegacyBexParserTest - testParse

  • 报错:
java.lang.IllegalAccessError: class org.xml.sax.helpers.XMLReaderFactory (in unnamed module @0x66434cc8) cannot access class jdk.xml.internal.SecuritySupport (in module java.xml) because module java.xml does not export jdk.xml.internal to unnamed module @0x66434cc8
  • 原因:同上

  • 解决方法:同上

    @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*", "org.w3c.*"})
    

8、koca-distributed-lock-integration-redis - RedisLockRegistryTest

  • 报错:
java.lang.RuntimeException: Can't start redis server. Check logs for details.
	at redis.embedded.AbstractRedisInstance.awaitRedisServerReady(AbstractRedisInstance.java:61)
	at redis.embedded.AbstractRedisInstance.start(AbstractRedisInstance.java:39)
	at redis.embedded.RedisServer.start(RedisServer.java:9)
	at com.szkingdom.koca.distributedlock.integration.redis.RedisAvailableRule.setupConnectionFactory(RedisAvailableRule.java:44)
	at com.szkingdom.koca.distributedlock.integration.redis.RedisAvailableTest.setupConnectionFactory(RedisAvailableTest.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.RunBefores.invokeMethod(RunBefores.java:33)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
  • 原因:Redis在启动时需要申请一块儿连续的内存空间,但此时没有足够的连续内存空间,所以启动失败。

  • 解决方法:直接定义启动时需要的内存大小,因为启动redis是用于单元测试,并不需要太大内存,把内存设置小一点即可:

    private static RedisServer redisServer = RedisServer.builder().setting("maxmemory 128M").setting("bind localhost").build();
    

2. koca-boot

  • koca-boot 在 Java11 环境下 编译、打包、安装都可通过运行。

测试 遇到的问题如下:

  • koca-auth-integration-tests

  • 报错:

    Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
    Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory
    [ERROR] Errors: 
    [ERROR]   ApiControlTest.ApiControl » IllegalState Failed to load ApplicationContext
    [ERROR]   BasicTest.accessAppService » IllegalState Failed to load ApplicationContext
    [ERROR]   BasicTest.authCodeTest » IllegalState Failed to load ApplicationContext
    [ERROR]   BasicTest.basic1 » IllegalState Failed to load ApplicationContext
    [ERROR]   BasicTest.basicPhoneAuth » IllegalState Failed to load ApplicationContext
    [ERROR]   BasicTest.basicPhonePwd » IllegalState Failed to load ApplicationContext
    [ERROR]   BasicTest.testProvider » IllegalState Failed to load ApplicationContext
    [ERROR]   KocaStrategyTest.basic1 » IllegalState Failed to load ApplicationContext
    [ERROR]   TokenSecurityTest.testToken » IllegalState Failed to load ApplicationContext
    [ERROR]   UserManageTest.testLogout » IllegalState Failed to load ApplicationContext
    [ERROR]   UserManageTest.testOnlineAndKick » IllegalState Failed to load ApplicationCont...
    
  • 报错原因:和上面 koca-bex-webservice 编译报错是类似的,Java 11 后,jaxb 模块被移除

  • 解决方法:在该模块下的 pom 文件中加入如下依赖

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-ri</artifactId>
        <version>2.3.3</version>
        <type>pom</type>
    </dependency>
    

3. koca-cloud

  • koca-cloud 在 Java11 环境下 编译、测试、打包、安装 都可通过运行。

4. koca-admin

  • koca-admin 在 Java11 环境下 编译 的问题如下:

1、 koca-admin-view-module

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project koca-admin-view-module: Compilation failure: Compilation failure: 
[ERROR] /D:/koca/koca-admin/src/modules/koca-admin-view-module/src/main/java/com/szkingdom/koca/admin/view/service/impl/ViewGroupServiceImpl.java:[12,24] 程序包javax.annotation不存在
[ERROR] /D:/koca/koca-admin/src/modules/koca-admin-view-module/src/main/java/com/szkingdom/koca/admin/view/service/impl/UserViewServiceImpl.java:[13,24] 程序包javax.annotation不存在
[ERROR] /D:/koca/koca-admin/src/modules/koca-admin-view-module/src/main/java/com/szkingdom/koca/admin/view/service/impl/UserComponentServiceImpl.java:[10,24] 程序包javax.annotation不存在
[ERROR] /D:/koca/koca-admin/src/modules/koca-admin-view-module/src/main/java/com/szkingdom/koca/admin/view/service/impl/ViewModuleServiceImpl.java:[12,24] 程序包javax.annotation不存在
[ERROR] /D:/koca/koca-admin/src/modules/koca-admin-view-module/src/main/java/com/szkingdom/koca/admin/view/service/impl/ViewGroupUserServiceImpl.java:[12,24] 程序包javax.annotation不存在
[ERROR] /D:/koca/koca-admin/src/modules/koca-admin-view-module/src/main/java/com/szkingdom/koca/admin/view/service/impl/ViewGroupServiceImpl.java:[47,6] 找不到符号
  • 原因:和上面 base 编译报错的问题一致,jdk11及其以上移除了 javax.annotation 包

  • 解决方法:在该模块下的 pom 添加如下依赖:

    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
    </dependency>
    

2、koca-admin-oem-client

  • 报错:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project koca-admin-oem-client: Compilation failure: Compilation failure: 
    [ERROR] /D:/koca/koca-admin/src/modules/koca-admin-oem/koca-admin-oem-client/src/main/java/com/szkingdom/koca/admin/oem/client/service/LicenseVerifyManager.java:[13,24] 程序包javax.annotation不存在
    [ERROR] /D:/koca/koca-admin/src/modules/koca-admin-oem/koca-admin-oem-client/src/main/java/com/szkingdom/koca/admin/oem/client/service/LicenseVerifyManager.java:[68,6] 找不到符号
    
  • 原因:同上

  • 解决方法:同上


测试 遇到的问题如下:

3、koca-admin-data-import-export - DataExportControllerTest

  • 报错:

    java.lang.NoClassDefFoundError: Could not initialize class javax.xml.transform.FactoryFinder
    
  • 解决方法:暂未找到合适的解决方法

5. koca-sample

1、koca-auth-sample 运行 报错:

nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
  • 原因:高版本的JDK中不包含 javax.xml.bind 包

  • 解决方法:在 pom.xml 加入

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-ri</artifactId>
        <version>2.3.3</version>
        <type>pom</type>
    </dependency>
    

6. koca-application

1、koca-cloud-admin-bootapp

  • 启动报错:

    org.springframework.core.NestedIOException: Invalid URI [jar:file:D:\repo\com\szkingdom\koca\cloud\koca-cloud-config-server\3.6.0-SNAPSHOT\koca-cloud-config-server-3.6.0-SNAPSHOT.jar!/bex/config-audit-bex.xml]; nested exception is java.net.URISyntaxException: Illegal character in opaque part at index 11: jar:file:D:\repo\com\szkingdom\koca\cloud\koca-cloud-config-server\3.6.0-SNAPSHOT\koca-cloud-config-server-3.6.0-SNAPSHOT.jar!/bex/config-audit-bex.xml
    
  • 原因:bex 和 xml 转换异常问题

  • 解决方法:

    koca:
      bex:
        enabled: true
        bex-path: classpath*:/bex/*-bex.xml
    

2、koca-admin-bootapp 中同样也要加上上述配置

3、koca-admin-bootapp

  • 启动报错:

    Caused by: java.lang.RuntimeException: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
     - with linked exception:
    
  • 原因:和上面的 koca-bex-webservice 报错是一样的,Java 11 后,jaxb 模块被移除

  • 解决方法:在该模块下的 pom 文件中加入如下依赖

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-ri</artifactId>
        <version>2.3.3</version>
        <type>pom</type>
    </dependency>
    

4、koca-admin-bootapp

  • 如果遇到如下启动报错(经过测试,偶尔会碰到这种情况):

    [2022-10-20 22:56:52.433] ERROR [admin,,,] 29316 --- [main] .s.k.a.a.a.s.i.RemoteAuthDataServiceImpl 57: 远程调用查询数据错误
    
    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
    ### Error querying database.  Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @6442b0a6
    ### The error may exist in URL [jar:file:/E:/koca-application/koca-application/admin-msa/3-koca-admin-bootapp/target/koca-admin-3.6.0-SNAPSHOT-full.jar!/BOOT-INF/lib/koca-admin-app-access-3.6.0-SNAPSHOT.jar!/mybatis/AccessAppDao.xml]
    ### The error may involve com.szkingdom.koca.admin.api.auth.dao.AccessAppDao.getRemoteAccessApp
    ### The error occurred while executing a query
    ### Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @6442b0a6
            at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:78)
            at com.szkingdom.koca.support.datasource.mybatis.CustomSqlSessionTemplate$SqlSessionInterceptor.invoke(CustomSqlSessionTemplate.java:444)
            at jdk.proxy2/jdk.proxy2.$Proxy185.selectList(Unknown Source)
    
  • 原因:参考:module java.base does not "opens java.lang" to unnamed module - 滔天蟹 - 博客园 "module java.base does not “opens java.lang.reflect” ",所以直接在启动配置中,加入即可

  • 解决方法:编辑启动的配置,在 JVM 选项中加入

    --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
    
  • 参考资料:junit - PowerMock & Java 11 - Stack Overflow

KOCA 适配 Java 17

注意:Java 17 要在上述 Java11 改动的基础上进行同样的修改操作,除了测试类问题修改不一致,其他问题都是类似的。

如果要换成 Java 17 环境运行 koca,必须在上述 Java11 的非测试类改动下作出同样的修改操作,方可运行成功。

1. koca-base

编译没问题,测试报错如下:

1、AesCryptoAlgorithmTest

  • 报错原因:PowerMock 和 Mockito 不适用于 JDK 17
java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @1eb44e46

2、CryptoUtilsTest

  • 报错原因:同上

  • 解决方法:和上面加的 vm 参数有些差异

@PowerMockIgnore({"javax.crypto.*","com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*", "org.w3c.*"})
--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED

3、Sm3CryptoAlgorithmTest

  • 报错原因:同上
java.lang.reflect.InaccessibleObjectException: Unable to make private native java.lang.reflect.Field[] java.lang.Class.getDeclaredFields0(boolean) accessible: module java.base does not "opens java.lang" to unnamed module @1eb44e46
  • 解决方法:运行参数加上
--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED

4、MybatisPlusTest

  • 原因:同上
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @7d6f77cc
  • 解决方法:在运行的 VM 参数加上
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED

5、KocaJdbcMybatisTest

  • 报错原因:同上

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @7e774085
    
  • 解决方法:运行参数加上

    --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
    

6、AuthContextHolderTest

  • 原因:同上

    java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @5eb5c224
    
  • 解决方法:在运行的 VM 参数加上

    --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
    
  • base 里面的测试类大多都是这个问题,这里的测试类就不一一列举了,因为Java17和powermock不兼容的原因,暂未找到合适的方法来解决,只能尝试升级powermock版本来试试。

  • 可以总结为:从 Java 9 开始,除非明确导出/打开它们,否则并非所有模块都可以访问。由于这是一个运行时问题,可以添加--add-opens为 JVM arg/CLI 选项以使该类型可访问。如果必须允许类路径上的代码进行深度反射以访问非公共成员,请使用 --add-opens 运行时选项。如果您还想导出编译时可用的内部类型,可以使用--add-exports,ALL-UNNAMED意味着指定的包在整个代码库中可用。

  • 参考资料:java - Powermock Compatibility with JDK 17 - Stack Overflow

  • https://so.muouseo.com/qa/pe6mm3d1l6d2.html


2. koca-boot

  • koca-boot 编译可通过运行

  • koca-boot 测试遇到的问题如下:

1、koca-boot-actuator 下的测试:BexApiParamHandlerTests、BexApiScannerServiceImplTests、CommonApiScannerServiceImplTests、RestApiParamHandlerTests、ServletApiScannerServiceImplTests、KocaHttpMetricsFilterTest

  • 大多都是和上面 base 下测试类似的问题
java.lang.reflect.InaccessibleObjectException: Unable to make private native java.lang.reflect.Field[] java.lang.Class.getDeclaredFields0(boolean) accessible: module java.base does not "opens java.lang" to unnamed module @c2e1f26
  • koca-boot 打包可通过运行

  • koca-boot 安装可通过运行

3. koca-cloud

  • koca-cloud 下编译可通过运行

  • koca-cloud 下的 koca-cloud-config-server 、koca-cloud-tracing 、koca-cloud-register等测试类中大多都有这些类似的问题,这里就列举几个出来,解决方法还是和上面一样的。

    1、KocaTraceRepDataFilterTest 、NamespaceVersionServiceImplTest、ReleaseHistoryServiceImplTest:

    java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @299a06ac
    
  • koca-cloud 下打包可通过运行

  • koca-cloud 下安装可通过运行

4. koca-admin

  • koca-admin 编译、安装可通过运行

  • koca-admin 测试中大多也是这个问题,就不一一列举了,解决方法参考上述

    com.szkingdom.koca.admin.api.auth.meta.LocalAccessAppAuthMetaLoaderTest  Time elapsed: 1.052 sec  <<< ERROR!
    java.lang.reflect.InaccessibleObjectException: Unable to make field private int java.lang.reflect.Field.modifiers accessible: module java.base does not "opens java.lang.reflect" to unnamed module @71dac704
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    

5. koca-sample

  • koca-sample 下测试遇到的问题和上述类似base下的测试是类似的,暂未找到合适的解决方法,只能在单个测试下编辑加入VM 参数,才能通过运行。

6. koca-application

1、koca-cloud-admin-bootapp

  • 报错:

    java.lang.reflect.InaccessibleObjectException: Unable to make field private transient volatile java.lang.reflect.Parameter[] java.lang.reflect.Executable.parameters accessible: module java.base does not "opens java.lang.reflect" to unnamed module @6913c1fb
    
  • 原因:和上述Java11 的问题类似,参考:module java.base does not "opens java.lang" to unnamed module - 滔天蟹 - 博客园

  • 解决方法:编辑启动的配置,在 JVM 选项中加入

    --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
    

2、koca-admin-bootapp

  • 报错:

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.lang.reflect.InaccessibleObjectException: Unable to make field protected java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.h accessible: module java.base does not "opens java.lang.reflect" to unnamed module @27f981c6
    ### The error may exist in URL [jar:file:/D:/repo/com/szkingdom/koca/admin/koca-admin-app-access/3.6.0-SNAPSHOT/koca-admin-app-access-3.6.0-SNAPSHOT.jar!/mybatis/AccessAppDao.xml]
    ### The error may involve com.szkingdom.koca.admin.api.auth.dao.AccessAppDao.getRemoteAccessApp
    ### The error occurred while executing a query
    
  • 原因:同上

  • 解决方法:同上

1 个赞