Java gradle、giraph和hadoop的NoClassDefFoundError

Java gradle、giraph和hadoop的NoClassDefFoundError,java,hadoop,gradle,noclassdeffounderror,giraph,Java,Hadoop,Gradle,Noclassdeffounderror,Giraph,所以,我一直在四处寻找,我没有找到一个好的答案来回答我的问题,这让我发疯,所以我想我应该在这里问一下,希望我能得到帮助。我正在尝试使用gradle在Giraph项目中进行自动化测试。我对格拉德尔完全是个初学者。为了开始,我将SimpleShortTestPathComputing类的测试代码复制到我的项目中,以确保能够启动并运行测试。然而,当我进行梯度测试时,我得到以下错误: $ gradle test --info <skipping some output here...> S

所以,我一直在四处寻找,我没有找到一个好的答案来回答我的问题,这让我发疯,所以我想我应该在这里问一下,希望我能得到帮助。我正在尝试使用gradle在Giraph项目中进行自动化测试。我对格拉德尔完全是个初学者。为了开始,我将SimpleShortTestPathComputing类的测试代码复制到我的项目中,以确保能够启动并运行测试。然而,当我进行
梯度测试时,我得到以下错误:

$ gradle test --info
<skipping some output here...>

Successfully started process 'Gradle Test Executor 1'
Gradle Test Executor 1 started executing tests.
WCCTest > testToyData FAILED
    java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:142)
        at WCCTest.testToyData(WCCTest.java:180)

    Caused by:
    java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 2 more

Gradle Test Executor 1 finished executing tests.
WCCTest > testOnShorterPathFound FAILED
    java.lang.NoClassDefFoundError: org.apache.hadoop.conf.Configuration
        at sun.reflect.GeneratedSerializationConstructorAccessor33.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
        at     org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
        at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
        at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:128)
        at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:63)
        at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56)
        at org.mockito.internal.creation.CglibMockMaker.createMock(CglibMockMaker.java:23)
        at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
        at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)
        at org.mockito.Mockito.mock(Mockito.java:1243)
        at org.mockito.Mockito.mock(Mockito.java:1120)
        at org.apache.giraph.utils.MockUtils$MockedEnvironment.<init>(MockUtils.java:68)
        at org.apache.giraph.utils.MockUtils.prepareVertexAndComputation(MockUtils.java:132)
        at WCCTest.testOnShorterPathFound(WCCTest.java:64)

WCCTest > testToyDataJson FAILED
    java.lang.NoClassDefFoundError: Could not initialize class org.apache.giraph.conf.GiraphConfiguration
        at WCCTest.testToyDataJson(WCCTest.java:127)

WCCTest > testOnNoShorterPathFound FAILED
    java.lang.NoClassDefFoundError: org.apache.hadoop.conf.Configuration
        at sun.reflect.GeneratedSerializationConstructorAccessor33.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
        at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
        at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
        at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:128)
        at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:63)
        at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56)
        at org.mockito.internal.creation.CglibMockMaker.createMock(CglibMockMaker.java:23)
        at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
        at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)
        at org.mockito.Mockito.mock(Mockito.java:1243)
        at org.mockito.Mockito.mock(Mockito.java:1120)
        at org.apache.giraph.utils.MockUtils$MockedEnvironment.<init>(MockUtils.java:68)
        at org.apache.giraph.utils.MockUtils.prepareVertexAndComputation(MockUtils.java:132)
        at WCCTest.testOnNoShorterPathFound(WCCTest.java:95)

4 tests completed, 4 failed
<more output...>
:test FAILED
:test (Thread[main,5,main]) completed. Took 1.663 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///...build/reports/tests/index.html

BUILD FAILED

它编译起来没有问题,我作为依赖项包含的jar文件包括它表示为NoClassDefFoundError的类(根据
jar tf
)。知道我做错了什么吗?提前感谢。

尝试将以下内容添加到您的build.gradle中

    println("HADOOP_HOME=$HADOOP_HOME")
    compile files("$HADOOP_HOME/hadoop-core-0.20.203.0.jar")
    println("System.env.HADOOP_HOME=$System.env.HADOOP_HOME")
    compile files("$System.env.HADOOP_HOME/hadoop-core-0.20.203.0.jar")

事实证明,我只需将$HADOOP_HOME/lib目录中的一些jar添加到依赖项中,就可以了。一旦我为
org/apache/commons/logging/LogFactory添加了依赖项,它就清除了hadoop配置类的错误,之后我只需添加其他必需的JAR。

嘿,谢谢你的帮助。实际上:
$jar tf hadoop-core-0.20.203.0.jar | grep Configur
输出:
org/apache/hadoop/conf/Configurable.class org/apache/hadoop/conf/Configuration$1.class org/apache/hadoop/conf/Configuration$integerages$Range.class org/apache/hadoop/conf/Configuration.class
再加上一些其他的东西。另外,当我使用这个编译组时,我还遇到了一些其他错误:
java.lang.ClassNotFoundException:org.apache.commons.configuration.configuration
javax.security.auth.login.LoginException:java.lang.NoClassDefFoundError
etc不确定这里是否应该在原始帖子中添加完整的新输出,你能详细介绍一下使用$HADOOP_HOME吗?你的意思是把它放进编译文件($HADOOP\u HOME)
里面吗?如果我这样做,它似乎根本不包含任何内容,而且我必须包含核心jar。我真的很感谢你的帮助。对不起,我以前的回答不正确。我已经更新了我的答案。你能试试吗?请注意:在HADOOP_HOME未定义的前两行中使用双引号not single oneWell(我只是将其放在示例代码中以隐藏文件系统中的实际路径)。第二行可以工作,但这只是给了我已经有了相同的东西,所以我得到了相同的错误
    println("HADOOP_HOME=$HADOOP_HOME")
    compile files("$HADOOP_HOME/hadoop-core-0.20.203.0.jar")
    println("System.env.HADOOP_HOME=$System.env.HADOOP_HOME")
    compile files("$System.env.HADOOP_HOME/hadoop-core-0.20.203.0.jar")