java.lang.NoClassDefFoundError:org / hamcrest / SelfDescribing


110

在运行junit测试时,eclipse我得到这个Exception

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

我添加了junit.jar库文件。

我试过不同版本的junit.jar的:4.44.8等等。

如何解决此异常?


根据您的描述,junit.jar与问题无关
Andremoniy 2013年

1
harcrest罐子中,层次结构是否相同?如中所述org > hamcrest > SelfDescribing,还是在jar的根文件夹中?
Danyel 2013年


1
此错误可能不是junit jar出现的,也许您项目中的某些东西需要其他jar,这里有一些org.hamcrest.SelfDescribing-已知版本
jdurango,2013年

1
谢谢,但是我在项目中没有别的东西,我已经创建了这个新项目。
user2013948 2013年

Answers:


92

添加hamcrest-all-X.X.jar到您的classpath中

截至2015年2月的最新版本是1.3:http : //code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can= 2& q=


2
如何将其添加到classpath或检查是否已添加?
托马什Zato -恢复莫妮卡

同意,该怎么做会有所帮助。幸运的是下面有评论。
MarkII

@TomášZato首先:检查文件。这是万能的(获得全部很重要)。在Idea-IDE中添加了一个依赖项1.将文件复制/粘贴到libs文件夹(或其他位置)2.在文件“添加为库”上单击鼠标右键3.在.java文件中检查导入语句。
Martin Pfeffer

hamcrest-all-X.X.jar足够而小得多。
Elist

1
文件---项目结构---库---'+'--- Java --- .... jar(您已下载)---好的,它将显示在“外部库”中。
Simon Z.

56

据JUnit的GitHub的团队网站(https://github.com/junit-team/junit/wiki/Download-and-Install),junit.jarhamcrest-core.jar使用JUnit 4.11时在类路径中都需要的。

这是包含junit和hamcrest的Maven依赖关系块。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.2</version>
    <scope>test</scope>
</dependency>
<!-- Needed by junit -->
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

我应该在Junit 5中面对这个问题,尽管应该不用它就可以工作
Nikhil Sahu

22

您必须遵循的几个步骤:

  1. 右键单击该项目。
  2. 选择构建路径,然后从其菜单中选择添加库。
  3. 选择JUnit,然后单击Next。
  4. 选择JUnit4,然后选择Finish。

1
这为我解决了。对于不习惯使用Java / Eclipse的人来说,这非常有帮助。我还想提及一下,我的讲师为班级提供的实验所使用的Junit版本(也许是3)与我的Eclipse的实验/版本不兼容。我必须将其删除并添加4,现在一切都很好。非常感谢。
托尼

当您使用命令提示符运行构建时,此方法不起作用。这是仅“ IDE”解决方案。
Partha

16

对我有用:IntelliJ IDEA 13.1.1,JUnit4,Java 6

我更改了项目路径中的文件:[PROJECT_NAME] .iml

替换为:

  <library>
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

通过:

  <library name="JUnit4">
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
      <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
      <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-library-1.3.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

因此,最终的.iml文件为:

<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="module-library">
      <library name="JUnit4">
        <CLASSES>
          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-library-1.3.jar!/" />
        </CLASSES>
        <JAVADOC />
        <SOURCES />
      </library>
    </orderEntry>
  </component>
</module>

PS:保存文件,不要让IntelliJ Idea重新加载它。就一次。


超级棒!!帮助我完成当前的项目。
MarkII


3

此问题是由于您的类路径缺少hamcrest-core-1.3.jar所致。要解决此问题,请在将junit-4.XX.jar添加到类路径中时添加hamcrest-core-1.3.jar。

一开始,我也遇到了这个问题,但是在我参考官方站点并使用命令行将hamcrest-core-1.3.jar添加到classpath后,它终于可以正常工作了。

javac -d ../../../../bin/ -cp ~/libs/junit-4.12.jar:/home/limxtop/projects/algorithms/bin  MaxHeapTest.java 

java -cp ../../../../bin/:/home/limxtop/libs/junit-4.12.jar:/home/limxtop/libs/hamcrest-core-1.3.jar org.junit.runner.JUnitCore com.limxtop.heap.MaxHeapTest

2

通常,请确保hamcrest在类路径上的任何其他测试库之前,因为许多此类库都包含hamcrest类,因此可能与您使用的hamcrest版本冲突。这将解决您所描述类型的大多数问题。


2

以防万一有人在使用netbeans并遇到相同的问题,您要做的就是

  • 右键单击TestLibraries
  • 单击添加库
  • 选择JUnit,然后单击添加库
  • 重复该过程,但这一次单击Hamcrest,然后单击添加库

这应该解决问题


谢谢,这对我有用。我已经有JUnit库,但是我缺少Hamcrest。
S. Mayol


1

听起来像是类路径问题,所以有几种不同的解决方法。org / hamcret / SelfDescribing来自哪里?那是您的班级还是在另一个罐子里?

尝试转到项目的“构建路径”,然后在“库”选项卡上,添加一个库。您应该能够在项目中选择JUnit。这与在项目中仅包含JUnit jar文件有所不同。

在JUnit测试的运行配置中,检查类路径。您可以通过添加确保您的Classpath可以在其中看到SelfDescribing类来解决此问题。Eclipse中的Run选项为JUnit选项提供了一组不同的选项。


它不是类路径的问题,因为我已经在构建路径中添加了junit库文件,即使在junit库中也有对hamcrest的引用,即C:/devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948 2013年

感谢您的回复,testNG正常工作,看来我必须在junit上退出
user2013948 2013年

我只是在想,当您将某些作为单元测试运行时,JUnit实际上启动了一个新的JVM。这意味着它有时使用与项目不同的类路径。有时,为了调试这些类型的事情,我从代码中打印出java类路径,以便在执行时可以比较它们之间的差异。java-tips.org/java-se-tips/java.lang/…–
Logan

1

如果在RCP项目中出现此问题,可能是因为已明确导入JUnit。

检查编辑器中的plugin.xmlunder Dependencies选项卡,org.junit从Imported Packages中删除,然后添加org.junit到Required Plug-ins。


1

问题是当您将eclipse设置为指向JRE而不是JDK时。JRE junit4.jarlib/ext文件夹中,但没有hamcrest.jar:)解决方案是在Eclipse中检查已安装的JRE,删除现有的JRE并创建一个指向您的JDK的新JRE 。


1

解决该问题的最简单方法是将最新版本的hamcrest-code.jar复制到CLASSPATH中,该文件是您存储编译和运行应用程序所需的其他.jar文件的文件。

可能是例如:C:/ ant / lib


1

通过命令行运行Ant时会发生这种情况。隐式用户依赖项最后添加到类路径中,并且优先于项目添加的类路径。用-nouserlib标志运行Ant 。隐式依赖关系将从类路径中排除。


1

有一个更好的答案来解决这个问题。添加依赖

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>


0

您必须遵循的几个步骤:

  • 右键单击该项目。
  • 选择“构建路径”,然后从其菜单中选择“添加库”。
  • 选择JUnit,然后单击Next。
  • 选择JUnit4,然后选择Finish。

这对我有用...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.