首页 > 解决方案 > java.lang.reflect.InaccessibleObjectException:从 java 11 升级到 17 时无法创建受保护的最终 java.lang.Class

问题描述

我们的项目使用 [schema-repo-server][1]。启动 schema-repo-server 的代码如下 -

    package technorati.tut.fes;
    
    import org.schemarepo.server.RepositoryServer;
    import java.util.Properties;
    
    public class Main2 {
        public static void main(String[] args) throws Exception {
            Properties props = new Properties();
            props.put("schema-repo.class", "com.technorati.camus.schemaregistry.ZooKeeperRepository");
            props.put("schema-repo.zookeeper.ensemble", "kafka01.cap.qa.opal.synacor.com:2181,kafka02.cap.qa.opal.synacor.com:2181,kafka03.cap.qa.opal.synacor.com:2181");
            RepositoryServer rs = new RepositoryServer(props);
            rs.start();
        }
    
    }
    

此代码在 java11 中运行良好。

我正在将 java 版本从 java 11 升级到 java 17。升级后,当我启动服务时,出现以下错误。

注意:启动列表中的模块是 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens jdk.management/com .sun.management.internal=全部未命名

我该如何解决这个问题?

14:18:48 INFO [org.schemarepo.server.RepositoryServer] 在线程“main”com.google.inject.internal.util.$ComputationException: java.lang.ExceptionInInitializerError 中通过 SLF4J 路由 java.util.logging 流量.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553) 在 com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419) 在 com.google .inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041) 在 com.google.inject.internal.FailableCache.get(FailableCache.java:50) 在 com.google.inject.internal.ConstructorInjectorStore。 get(ConstructorInjectorStore.java:49) 在 com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125) 在 com.google.inject.internal.InjectorImpl.initializeBinding(InjectorImpl.java:507)在 com.google.inject.internal.ProcessedBindingData.initializeBindings(ProcessedBindingData.java:44) 在 com.google.inject 的 com.google.inject.internal.AbstractBindingProcessor$Processor$1.run(AbstractBindingProcessor.java:159)。 internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:122) 在 com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 在 com.google.inject.Guice.createInjector(Guice.java:95) 在 com .google.inject.Guice.createInjector(Guice.java:72) at com.google.inject.Guice.createInjector(Guice.java:62) at org.schemarepo.server.RepositoryServer.(RepositoryServer.java:97) at technorati .tut.fes.Main2.main(Main2.java:12) 原因:com.google.inject.internal.cglib.reflect.$FastClassEmitter.(FastClassEmitter.java:67) com.google 的 java.lang.ExceptionInInitializerError .com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 上的 inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:72)。 com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:64) 上的 inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:216)。在 com.google.inject.internal.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:53) 在 com.google.inject.internal.ProxyFactory.create(ProxyFactory.java: 153) 在 com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:89) 在 com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:28) 在 com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:36) 在 com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:32) 在 com.google.inject.internal .FailableCache$1.apply(FailableCache.java:39) at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549) ... 15 更多原因: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”到 java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357) 的 java.base/java.lang.reflect.AccessibleObject 的未命名模块 @f0c8a99。checkCanSetAccessible(AccessibleObject.java:297) 在 java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) 在 java.base/java.lang.reflect.Method.setAccessible(Method.java:193)在 com.google.inject.internal.cglib.core.$ReflectUtils$2.run(ReflectUtils.java:56) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:312) 在 com.google.inject .internal.cglib.core.$ReflectUtils.(ReflectUtils.java:46) ... 29 更多(ReflectUtils.java:46) ... 29 更多(ReflectUtils.java:46) ... 29 更多

进程以退出代码 1 结束

这工作正常 [1]:https ://mvnrepository.com/artifact/org.schemarepo/schema-repo-server 。

注意:我添加了 vm 参数 --illegal-access=permit --add-opens java.base/java.lang=ALL-UNNAMED,但我仍然在 java-17 上遇到此错误

标签: javajava-11java-17

解决方案


也许尝试在 lauch 添加一个 vm 参数:

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

--illegal-access 在 Java 17 中设置为无效(所有值都等同于拒绝),但仍然可以使用 --add-opens 命令行选项或 Add-Opens JAR 文件清单属性,打开特定的包(参见 openjdk.java.net/jeps/403 )


推荐阅读