2013-06-20 44 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月發佈。

相關問題