为什么 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的问题根本没有(在我们的例子中)。但事实是,由于贫穷Exception
在 Guice 3 中处理,我们得到了与作者相同的错误消息。
TL/DR
我们问题的根源是NoClassDefFoundError: Could not initialize class ...
抛出的异常static阻止我们的一堂课。
事实证明,我们有excludedfat-jar 构建过程中的类太多,而且只是缺少一些类。不幸的是,对于 Guice 3,我们只收到$ComputationException: java.lang.ArrayIndexOutOfBoundsException: ...
留言,帮助我们。
我的观点是,Guice 3 可能不是问题的根源.
完整版
我们有一个项目 (A),我们将其作为依赖项包含在在 Spark 集群上运行的项目 (B) 中
-
项目A,正在使用log4j 2
, and spark-hive
(在项目 B 中使用)由于某种原因不喜欢它在类路径中具有额外的日志框架,因此我们将其排除在sbt-assembly
:
ExclusionRule(organization = "org.apache.logging.log4j"),
-
在项目 A 中,我们有一个类,其中包含如下代码 (java):
static {
this.defaultMarker = MarkerManager.getMarker("abc")
}
And MarkerManager
来自org.apache.logging.log4j
,因此项目 B 的 fat-jar 中缺少该类。
我们在集群上运行它,其中一些应该是的类@injected
使用带有静态块的类。
Boom! $ComputationException: java.lang.ArrayIndexOutOfBoundsException
我决定手动初始化所有类,而不需要Guice
却发现并非如此Guice
fault.
Fix the ExclusionRule
Guice 3 又可以正常工作了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)