2013-06-20 4 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 Dependecies

<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. Поскольку вы используете hasoop2, вам нужно удалить первую зависимость «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 года.

Смежные вопросы