Guice 3.0 - 启动时的ArrayIndexOutOfBoundsException?

时间:2016-04-02 17:18:40

标签: guice-3

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

 imageName='uploads/2015-10-04_19.59.41.jpg' 

我的初始代码是:

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

TL / DR

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

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

我的意思是,可能Guice 3并非您问题的根源

完整版本

  1. 我们有一个项目(A)作为依赖项包含在运行在Spark Cluster上的项目(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的胖子容器中缺少此类。

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

  5. 景气! $ComputationException: java.lang.ArrayIndexOutOfBoundsException

  6. 我决定手动初始化所​​有类,而没有Guice,只是为了确定不是Guice错误。

  7. 修复ExclusionRule并再次与Guice 3兼容。