java.lang.reflect.InaccessibleObjectException:无法使受保护的最终 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 16。升级后,当我启动服务时出现以下错误

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

我该如何解决这个问题?

14:18:48 INFO [org.schemarepo.server.RepositoryServer] 通过 SLF4J 路由 java.util.logging 流量 线程“main”中的异常 com.google.inject.internal.util.$computationException: java.lang.ExceptionInInitializerError 在 com.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.AbstractBindingProcessor$Processor$1.run(AbstractBindingProcessor.java:159) 在 com.google.inject.internal.ProcessedBindingData.initializeBindings(ProcessedBindingData.java:44) 在 com.google.inject.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) 在 com.google.inject.Guice.createInjector(Guice.java:62) 在 org.schemarepo.server.RepositoryServer.(RepositoryServer.java:97) 在 technorati.tut.fes.Main2.main(Main2.java:12) 引起:java.lang.ExceptionInInitializerError 在 com.google.inject.internal.cglib.reflect.$FastClassEmitter.(FastClassEmitter.java:67) 在 com.google.inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:72) 在 com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 在 com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:216) 在 com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:64) 在 com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:207) 在 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) 在 com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549) ……还有 15 个 引起:java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.class java.lang.classLoader.defineClass(java.lang.String,byte[],int,java.security.ProtectionDomain) throws java.lang.classFormatError 可访问:模块 java.base 不会“打开 java.lang”到未命名的模块 @f0c8a99 在 java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357) 在 java.base/java.lang.reflect.AccessibleObject.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 个

进程以退出代码 1 结束

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

解决方法

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

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