【问题标题】:java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class when upgrade from java 11 to 17 [duplicate]java.lang.reflect.InaccessibleObjectException:从java 11升级到17时无法制作受保护的最终java.lang.Class [重复]
【发布时间】:2021-06-28 18:53:10
【问题描述】:

我们的项目使用 [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=ALL-UNNAMED

我该如何解决这个问题?

14:18:48 INFO [org.schemarepo.server.RepositoryServer] 通过 SLF4J 路由 java.util.logging 流量 线程“主”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:无法使受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) 抛出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.

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

【问题讨论】:

    标签: java java-11 java-17


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2022-01-05
      • 2022-08-23
      • 2021-11-11
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2015-05-09
      • 2021-02-16
      相关资源
      最近更新 更多