我目前正在更新maven 3.1和更高版本的Maven插件。看起来这个插件工作得很好,但是我很难把测试套件更新到最新的变化。在经历了一场艰难的lib版本之战之后,我觉得一切都还好,但我在测试套件中得到了以下异常:
java.lang.ClassCastException: org.codehaus.plexus.DefaultPlexusContainer$LoggerManagerProvider cannot be cast to javax.inject.Provider
at com.google.inject.internal.InternalFactoryToInitializableAdapter.get(InternalFactoryToInitializableAdapter.java:46)
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:84)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1059)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80)
at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:174)
at com.google.inject.internal.Initializer.injectAll(Initializer.java:108)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:174)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
at com.google.inject.Guice.createInjector(Guice.java:96)
at com.google.inject.Guice.createInjector(Guice.java:73)
at com.google.inject.Guice.createInjector(Guice.java:62)
at org.codehaus.plexus.DefaultPlexusContainer.addPlexusInjector(DefaultPlexusContainer.java:481)
at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:206)
at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:168)
at net.flexmojos.oss.plugin.compiler.DependencyFilteringTest.initPlexus(DependencyFilteringTest.java:66)奇怪的是,Maven: org.eclipse.sisu:org.eclipse.sisu.plexus:0.3.0.M1库中包含了org.codehaus.plexus.DefaultPlexusContainer
final class org.codehaus.plexus.DefaultPlexusContainer.LoggerManagerProvider
implements org.eclipse.sisu.inject.DeferredProvider<LoggerManager>它位于org.eclipse.sisu:org.eclipse.sisu.inject:0.3.0.M1中,包含
public interface org.eclipse.sisu.inject.DeferredProvider<T>
extends com.google.inject.Provider<T>它位于org.sonatype.sisu:sisu-guice:3.2.4
public interface com.google.inject.Provider<T> extends javax.inject.Provider<T> {因此,LoggerManagerProvider最终必须既是com.google.inject.Provider又是javax.inject.Provider……如果我在调试器中停止并检查:
tst instanceof com.google.inject.Provider --> True
tst instanceof javax.inject.Provider --> False 这怎么可能呢?我猜我的虚拟机中有一些糟糕的类版本垃圾,但我不知道该如何跟踪它。
克里斯
发布于 2014-10-17 03:52:45
好的..。在我的问题中,类的层次结构是:
org.codehaus.plexus.DefaultPlexusContainer.LoggerManagerProvider --> org.eclipse.sisu.inject.DeferredProvider --> com.google.inject.Provider --> javax.inject.Provider
我检查了我的类路径是否只包含一个org.eclipse.sisu.inject.DeferredProvider和一个javax.inject.Provider ...但是今天我发现一个奇怪的包提供了一个不同的com.google.inject.Provider实现。在从构建中排除这一点之后,一切都很好:-)
我想我必须习惯使用像Tattletale (http://tattletale.jboss.org/)之类的插件来检测类似的东西。
https://stackoverflow.com/questions/26327307
复制相似问题