【问题标题】:Guice 3.0 - ArrayIndexOutOfBoundsException on startup?Guice 3.0 - 启动时出现 ArrayIndexOutOfBoundsException?
【发布时间】:2016-04-02 17:18:39
【问题描述】:

为什么 Guice 3.0 会抛出此异常,而不是针对错误配置组件的格式化消息(例如缺少 @Inject)?

Exception in thread "main" com.google.inject.internal.util.$ComputationException: java.lang.ArrayIndexOutOfBoundsException: 16640
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
    at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
    at com.google.inject.internal.util.$StackTraceElements.forMember(StackTraceElements.java:53)
    at com.google.inject.internal.Errors.formatInjectionPoint(Errors.java:716)
    at com.google.inject.internal.Errors.formatSource(Errors.java:678)
    at com.google.inject.internal.Errors.format(Errors.java:555)
    at com.google.inject.ConfigurationException.getMessage(ConfigurationException.java:70)
    at java.lang.Throwable.getLocalizedMessage(Throwable.java:391)
    at java.lang.Throwable.toString(Throwable.java:480)
    at java.lang.String.valueOf(String.java:2982)
    at java.io.PrintStream.println(PrintStream.java:821)
    at java.lang.Throwable$WrappedPrintStream.println(Throwable.java:748)
    at java.lang.Throwable.printStackTrace(Throwable.java:655)
    at java.lang.Throwable.printStackTrace(Throwable.java:643)
    at java.lang.Throwable.printStackTrace(Throwable.java:634)
    at hu.daniel.hari.exercises.cleanarchitecture.payrollcasestudy.adapters.primary.ui.impl.swing._2.SwingUIMain2.<init>(SwingUIMain2.java:40)
    at hu.daniel.hari.exercises.cleanarchitecture.payrollcasestudy.adapters.primary.ui.impl.swing._2.SwingUIMain2.main(SwingUIMain2.java:17)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 16640
    at com.google.inject.internal.asm.$ClassReader.readClass(Unknown Source)
    at com.google.inject.internal.asm.$ClassReader.accept(Unknown Source)
    at com.google.inject.internal.asm.$ClassReader.accept(Unknown Source)
    at com.google.inject.internal.util.$LineNumbers.<init>(LineNumbers.java:62)
    at com.google.inject.internal.util.$StackTraceElements$1.apply(StackTraceElements.java:36)
    at com.google.inject.internal.util.$StackTraceElements$1.apply(StackTraceElements.java:33)
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
    ... 17 more

我的启动代码是:

Injector injector = Guice.createInjector(new SwingUIModule(useCaseFactory));
injector.getInstance(MainFrameUI.class).show();

【问题讨论】:

  • 您找到解决方案了吗?关于这个问题的任何线索?

标签: guice-3


【解决方案1】:

我们遇到了这个问题,事实证明这根本不是 Guice 3 问题(在我们的例子中)。但事实是,由于 Guice 3 中的 Exception 处理不佳,我们收到了与作者相同的错误消息。

TL/DR

问题的根源是NoClassDefFoundError: Could not initialize class ... 异常,该异常是在我们的一个类中的static 块中引发的。

事实证明,我们在 fat-jar 构建过程中排除了太多类,只是缺少一些类。不幸的是,在 Guice 3 中,我们只收到了 $ComputationException: java.lang.ArrayIndexOutOfBoundsException: ... 消息来帮助我们。

我的意思是,Guice 3 可能不是问题的根源

完整版

  1. 我们有一个项目 (A),我们将其作为依赖项包含在运行于 Spark 集群上的项目 (B) 中

  2. 项目 A 使用 log4j 2,而 spark-hive(在项目 B 中使用)由于某种原因不喜欢在类路径中有额外的日志框架,所以我们在 sbt-assembly 中排除了它:

    ExclusionRule(organization = "org.apache.logging.log4j"),
    
  3. 在项目 A 中,我们有一个类,可以说是这样的代码(java):

    static {
        this.defaultMarker = MarkerManager.getMarker("abc")
    }
    

    MarkerManager来自org.apache.logging.log4j,所以项目B的fat-jar中缺少这个类。

  4. 我们在集群上运行它,其中一些应该是@injected 的类使用带有静态块的类。

  5. 轰! $ComputationException: java.lang.ArrayIndexOutOfBoundsException

  6. 我决定手动初始化所​​有类,没有Guice才发现不是Guice故障。

  7. 修复ExclusionRule,这一切都再次适用于Guice 3。

【讨论】:

    【解决方案2】:

    我认为问题在于 Guice 3 及以下版本如何处理 lambda 表达式。如here 所述,您可能需要升级到 Guice 4 才能解决此问题。

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 2022-07-07
      • 2017-03-20
      • 1970-01-01
      • 2011-08-05
      • 2014-12-27
      • 2014-11-25
      • 2015-12-22
      • 2021-12-19
      相关资源
      最近更新 更多