当我尝试启动jetty时,为什么lambda表达式会破坏guiceerror handling?

我遇到以下问题,我尝试启动jetty,我得到以下的例外:

Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test failed: There was an error in the forked process [ERROR] org.apache.maven.surefire.testset.TestSetFailedException: java.lang.RuntimeException: com.google.inject.internal.util.$ComputationException: java.lang.ArrayIndexOutOfBoundsException: 51966 [ERROR] at org.apache.maven.surefire.common.junit4.JUnit4RunListener.rethrowAnyTestMechanismFailures(JUnit4RunListener.java:206) [ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createRequestAndRun(JUnitCoreWrapper.java:114) [ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.executeEager(JUnitCoreWrapper.java:85) [ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:54) [ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:134) [ERROR] at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) [ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) [ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) [ERROR] Caused by: java.lang.RuntimeException: com.google.inject.internal.util.$ComputationException: java.lang.ArrayIndexOutOfBoundsException: 51966 [ERROR] at org.apache.maven.surefire.junitcore.TestSet.replay(TestSet.java:100) [ERROR] at org.apache.maven.surefire.junitcore.ConcurrentRunListener.testSetCompleted(ConcurrentRunListener.java:82) [ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreRunListener.testRunFinished(JUnitCoreRunListener.java:73) [ERROR] at org.junit.runner.notification.RunNotifier$2.notifyListener(RunNotifier.java:95) [ERROR] at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:61) [ERROR] at org.junit.runner.notification.RunNotifier.fireTestRunFinished(RunNotifier.java:92) [ERROR] at org.junit.runner.JUnitCore.run(JUnitCore.java:161) [ERROR] at org.junit.runner.JUnitCore.run(JUnitCore.java:138) [ERROR] at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createRequestAndRun(JUnitCoreWrapper.java:113) [ERROR] ... 6 more [ERROR] Caused by: com.google.inject.internal.util.$ComputationException: java.lang.ArrayIndexOutOfBoundsException: 51966 [ERROR] at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553) [ERROR] at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419) [ERROR] at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041) [ERROR] at com.google.inject.internal.util.$StackTraceElements.forMember(StackTraceElements.java:53) [ERROR] at com.google.inject.internal.Errors.formatInjectionPoint(Errors.java:716) [ERROR] at com.google.inject.internal.Errors.formatSource(Errors.java:678) [ERROR] at com.google.inject.internal.Errors.format(Errors.java:555) [ERROR] at com.google.inject.CreationException.getMessage(CreationException.java:48) [ERROR] at java.lang.Throwable.getLocalizedMessage(Throwable.java:391) [ERROR] at java.lang.Throwable.toString(Throwable.java:480) [ERROR] at java.lang.String.valueOf(String.java:2979) [ERROR] at java.io.PrintWriter.println(PrintWriter.java:754) [ERROR] at java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:764) [ERROR] at java.lang.Throwable.printStackTrace(Throwable.java:655) [ERROR] at java.lang.Throwable.printStackTrace(Throwable.java:721) [ERROR] at org.junit.runner.notification.Failure.getTrace(Failure.java:71) [ERROR] at org.apache.maven.surefire.common.junit4.JUnit4StackTraceWriter.writeTraceToString(JUnit4StackTraceWriter.java:57) [ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:330) [ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:312) [ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.toString(ForkingRunListener.java:258) [ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.testError(ForkingRunListener.java:132) [ERROR] at org.apache.maven.surefire.junitcore.TestMethod.replay(TestMethod.java:118) [ERROR] at org.apache.maven.surefire.junitcore.TestSet.replay(TestSet.java:87) [ERROR] ... 14 more [ERROR] Caused by: java.lang.ArrayIndexOutOfBoundsException: 51966 [ERROR] at com.google.inject.internal.asm.$ClassReader.readUTF8(Unknown Source) [ERROR] at com.google.inject.internal.asm.$ClassReader.readClass(Unknown Source) [ERROR] at com.google.inject.internal.asm.$ClassReader.accept(Unknown Source) [ERROR] at com.google.inject.internal.asm.$ClassReader.accept(Unknown Source) [ERROR] at com.google.inject.internal.util.$LineNumbers.(LineNumbers.java:62) [ERROR] at com.google.inject.internal.util.$StackTraceElements$1.apply(StackTraceElements.java:36) [ERROR] at com.google.inject.internal.util.$StackTraceElements$1.apply(StackTraceElements.java:33) [ERROR] at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549) [ERROR] ... 36 more 

从我所看到的问题看来,lambdas打破了guiceerror handling,但仍然没有人提出解决方案。 如果有人知道这是什么,请发表评论!

当您在其中一个guice模块中配置错误并且使用Java 8 lambdas和guice 3时,会发生此不可读的exception。

我花了很多时间来解决这个问题。 每一次,我都通过升级到guice 4 beta解决了这个问题。 它的一个特点是:

更好的Java8运行时兼容性

如果你使用maven:

  com.google.inject guice 4.0-beta5  

这个新版本将为您提供清晰的错误消息和适当的堆栈跟踪,让您找到问题所在。 当你解决它后,你可以切换回guice 3.0或继续使用4.0-beta(从我看到的 – 已经稳定)。


编辑2016/07/13

请注意, guice 4.0和4.1已经发布 。 所以你应该使用最新版本:

  com.google.inject guice 4.1.0