Guice 3.0 - 启动时出现 ArrayIndexOutOfBoundsException?
Guice 3.0 - ArrayIndexOutOfBoundsException on startup?
为什么 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.apply(StackTraceElements.java:36)
at com.google.inject.internal.util.$StackTraceElements.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 及以下版本如何处理 lambda 表达式。您可能必须升级到 Guice 4 才能解决此问题 .
我们遇到过这个问题,事实证明这根本不是 Guice 3 问题(在我们的例子中)。但事实是,由于 Guice 3 中的 Exception
处理不当,我们收到了与作者相同的错误消息。
TL/DR
我们问题的根源是 NoClassDefFoundError: Could not initialize class ...
在我们的 classes 之一的 static 块中抛出的异常。
事实证明,我们在 fat-jar 构建过程中排除了 太多 classes,只是缺少了一些 classes。不幸的是,对于 Guice 3,我们只收到 $ComputationException: java.lang.ArrayIndexOutOfBoundsException: ...
消息来帮助我们。
我的观点是,Guice 3 可能不是您问题的根源。
完整版
我们有一个项目 (A) 作为依赖项包含在项目 (B) 中 运行ning on Spark Cluster
项目 A,正在使用 log4j 2
,并且 spark-hive
(在项目 B 中使用)出于某种原因不喜欢它在 class路径,所以我们在 sbt-assembly
中排除了它:
ExclusionRule(organization = "org.apache.logging.log4j"),
在项目 A 中,我们有一个 class,假设有这样的代码 (java):
static {
this.defaultMarker = MarkerManager.getMarker("abc")
}
而MarkerManager
来自org.apache.logging.log4j
,所以项目B的fat-jar中缺少这个class。
我们 运行 它在集群上,其中一些 class 应该是 @injected
使用带有静态块的 class。
轰! $ComputationException: java.lang.ArrayIndexOutOfBoundsException
我决定手动初始化所有classes,没有Guice
才发现这不是Guice
的错。
修复 ExclusionRule
,它再次与 Guice 3 一起工作。
为什么 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.apply(StackTraceElements.java:36)
at com.google.inject.internal.util.$StackTraceElements.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 及以下版本如何处理 lambda 表达式。您可能必须升级到 Guice 4 才能解决此问题
我们遇到过这个问题,事实证明这根本不是 Guice 3 问题(在我们的例子中)。但事实是,由于 Guice 3 中的 Exception
处理不当,我们收到了与作者相同的错误消息。
TL/DR
我们问题的根源是 NoClassDefFoundError: Could not initialize class ...
在我们的 classes 之一的 static 块中抛出的异常。
事实证明,我们在 fat-jar 构建过程中排除了 太多 classes,只是缺少了一些 classes。不幸的是,对于 Guice 3,我们只收到 $ComputationException: java.lang.ArrayIndexOutOfBoundsException: ...
消息来帮助我们。
我的观点是,Guice 3 可能不是您问题的根源。
完整版
我们有一个项目 (A) 作为依赖项包含在项目 (B) 中 运行ning on Spark Cluster
项目 A,正在使用
log4j 2
,并且spark-hive
(在项目 B 中使用)出于某种原因不喜欢它在 class路径,所以我们在sbt-assembly
中排除了它:ExclusionRule(organization = "org.apache.logging.log4j"),
在项目 A 中,我们有一个 class,假设有这样的代码 (java):
static { this.defaultMarker = MarkerManager.getMarker("abc") }
而
MarkerManager
来自org.apache.logging.log4j
,所以项目B的fat-jar中缺少这个class。我们 运行 它在集群上,其中一些 class 应该是
@injected
使用带有静态块的 class。轰!
$ComputationException: java.lang.ArrayIndexOutOfBoundsException
我决定手动初始化所有classes,没有
Guice
才发现这不是Guice
的错。修复
ExclusionRule
,它再次与 Guice 3 一起工作。