2013-06-20 41 views
0

当我运行测试情况下,我得到这个例外MRUNIT java.lang.IncompatibleClassChangeError

java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.TaskInputOutputContext, but class was expected 
    at org.apache.hadoop.mrunit.mapreduce.mock.MockContextWrapper.createCommon(MockContextWrapper.java:53) 
    at org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.create(MockMapContextWrapper.java:70) 
    at org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.<init>(MockMapContextWrapper.java:62) 
    at org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:217) 
    at org.apache.hadoop.mrunit.MapDriverBase.runTest(MapDriverBase.java:150) 
    at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:137) 
    at konnectMR.konnect.mr.MRTestOne.testMapper(MRTestOne.java:44) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) 
    at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42) 
    at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

这里是POM依赖条件

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.4</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-common</artifactId> 
    <version>2.0.3-alpha</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-mapreduce-client-core</artifactId> 
    <version>2.0.3-alpha</version> 
</dependency> 
<dependency> 
    <groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
    <version>2.2.4</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.mrunit</groupId> 
    <artifactId>mrunit</artifactId> 
    <version>0.9.0-incubating</version> 
    <classifier>hadoop1</classifier> 
</dependency> 
<dependency> 
    <groupId>org.apache.mrunit</groupId> 
    <artifactId>mrunit</artifactId> 
    <version>0.9.0-incubating</version> 
    <classifier>hadoop2</classifier> 
</dependency> 

谁能帮我解决这个问题?

回答

1

添加两个“org.apache.mrunit”依赖项。第一个“org.apache.mrunit”处于活动状态。它是hadoop1 api。由于您使用的是hadoop2,因此您需要删除“org.apache.mrunit”的第一个依赖项。删除以下内容:

<dependency> 
    <groupId>org.apache.mrunit</groupId> 
    <artifactId>mrunit</artifactId> 
    <version>0.9.0-incubating</version> 
    <classifier>hadoop1</classifier> 
</dependency> 

考虑到mrunit仅用于单元测试。您可以更改第二依赖于以下内容:

<dependency> 
    <groupId>org.apache.mrunit</groupId> 
    <artifactId>mrunit</artifactId> 
    <version>0.9.0-incubating</version> 
    <classifier>hadoop2</classifier> 
    <scope>test</scope> 
</dependency> 
-1

您需要删除您的最后两个依赖的一个:

<dependency> 
    <groupId>org.apache.mrunit</groupId> 
    <artifactId>mrunit</artifactId> 
    <version>0.9.0-incubating</version> 
    <classifier>hadoop1</classifier> 
</dependency> 
<dependency> 
    <groupId>org.apache.mrunit</groupId> 
    <artifactId>mrunit</artifactId> 
    <version>0.9.0-incubating</version> 
    <classifier>hadoop2</classifier> 
</dependency> 

根据Hadoop的版本您使用,保持依存性相应的classfier(hadoop1或hadoop2)并删除其他。

另外,考虑使用更新版本的MRUnit,1.1.0于2014年6月发布。

相关问题