java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing


110

ขณะjunitทำการทดสอบในeclipseฉันได้รับสิ่งนี้Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

ฉันได้เพิ่มjunit.jarไฟล์ไลบรารีแล้ว

ฉันได้พยายามรุ่นต่าง ๆ ของ junit.jar: 4.4, 4.8ฯลฯ

ฉันจะแก้ไขข้อยกเว้นนี้ได้อย่างไร


ตามคำอธิบายของคุณjunit.jarไม่เกี่ยวข้องกับปัญหา
Andremoniy

1
ในharcrestโถมีลำดับชั้นเหมือนกันหรือไม่? เช่นเดียวกับในorg > hamcrest > SelfDescribingหรืออยู่ในโฟลเดอร์รูทของ jar?
Danyel


1
ข้อผิดพลาดนี้อาจไม่ใช่สำหรับขวด Junit บางทีบางอย่างในโครงการของคุณอาจต้องการโถอื่น ๆ ที่นี่มีorg.hamcrest.SelfDescribing - เวอร์ชันที่รู้จัก
jdurango

1
ขอบคุณ แต่ฉันไม่มีสิ่งอื่นในโครงการฉันได้สร้างโครงการใหม่นี้แล้ว
user2013948

คำตอบ:


92

เพิ่มhamcrest-all-X.X.jarที่คุณclasspath

เวอร์ชันล่าสุด ณ เดือนกุมภาพันธ์ 2558 คือ 1.3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=


2
ฉันจะเพิ่มลงใน classpath ได้อย่างไรหรือตรวจสอบว่ามีการเพิ่มหรือไม่
Tomáš Zato - คืนสถานะ Monica

ตกลงกันว่าจะทำอย่างไรจะเป็นประโยชน์ โชคดีที่มีความคิดเห็นด้านล่างนี้
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.jarและhamcrest-core.jarจำเป็นใน classpath เมื่อใช้ JUnit 4.11

นี่คือบล็อกการพึ่งพา Maven สำหรับการรวม junit และ hamcrest

<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 จากนั้นคลิกถัดไป
  4. เลือก JUnit4 แล้วเลือก Finish

1
สิ่งนี้แก้ไขให้ฉัน สำหรับคนที่ไม่คุ้นเคยกับการใช้ java / Eclipse สิ่งนี้มีประโยชน์มาก ฉันอยากจะพูดถึงว่าห้องทดลองที่ผู้สอนของฉันจัดเตรียมไว้สำหรับชั้นเรียนนั้นมี Junit เวอร์ชันหนึ่ง (อาจจะ 3 แบบ) ที่ไม่ทำงานกับ Lab / เวอร์ชันของ Eclipse ของฉัน ฉันต้องลบออกและเพิ่ม 4 และตอนนี้ทุกอย่างเรียบร้อยดี ขอบคุณมาก.
Tony

สิ่งนี้ใช้ไม่ได้เมื่อคุณรันบิลด์โดยใช้พรอมต์คำสั่ง นี่เป็นโซลูชัน "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

ปัญหานี้เป็นเพราะ classpath ของคุณพลาด hamcrest-core-1.3.jar ในการแก้ไขปัญหานี้ให้เพิ่ม hamcrest-core-1.3.jar เมื่อคุณเพิ่ม junit-4.XX.jar ลงใน classpath ของคุณ

ตอนแรกฉันพบปัญหานี้เช่นกัน แต่หลังจากที่ฉันอ้างถึงเว็บไซต์อย่างเป็นทางการและเพิ่ม 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 อยู่ก่อนไลบรารีการทดสอบอื่น ๆ บน classpath เนื่องจากไลบรารีดังกล่าวจำนวนมากรวมถึงคลาส hamcrest และอาจขัดแย้งกับเวอร์ชัน hamcrest ที่คุณใช้อยู่ วิธีนี้จะแก้ไขปัญหาส่วนใหญ่ของประเภทที่คุณกำลังอธิบาย


2

ในกรณีที่มีใครใช้ netbeans และมีปัญหาเดียวกันสิ่งที่คุณต้องทำก็คือ

  • คลิกขวาที่ TestLibraries
  • คลิกที่ Add Library
  • เลือก JUnit แล้วคลิกเพิ่มไลบรารี
  • ทำซ้ำขั้นตอนนี้ แต่คราวนี้คลิกที่ Hamcrest และคลิกเพิ่มไลบรารี

สิ่งนี้ควรแก้ปัญหาได้


ขอบคุณสิ่งนี้ใช้ได้กับฉัน ฉันมีห้องสมุด JUnit แล้ว แต่ฉันไม่มี Hamcrest
S. Mayol


1

ดูเหมือนจะเป็นปัญหาของ classpath ดังนั้นจึงมีวิธีต่างๆที่จะดำเนินการต่อไปนี้ org / hamcret / SelfDescribing มาจากไหน? นั่นคือชั้นเรียนของคุณหรือในขวดที่แตกต่างกัน?

ลองไปที่เส้นทางการสร้างโครงการของคุณและบนแท็บไลบรารีเพิ่มไลบรารี คุณควรจะสามารถเลือก JUnit ให้กับโปรเจ็กต์ของคุณได้ สิ่งนี้แตกต่างจากการมีไฟล์ JUnit jar ในโปรเจ็กต์ของคุณเล็กน้อย

ใน Run Configuration สำหรับการทดสอบ JUnit ให้ตรวจสอบ Classpath คุณอาจแก้ไขได้โดยเพิ่มให้แน่ใจว่า Classpath ของคุณสามารถเห็นคลาส SelfDescribing ที่นั่น อ็อพชัน Run ใน Eclipse มีชุดอ็อพชันที่แตกต่างกันสำหรับอ็อพชัน JUnit


ไม่ใช่ปัญหาของ classpath เนื่องจากฉันได้เพิ่มไฟล์ไลบรารี 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

ขอบคุณสำหรับการตอบกลับ testNG ทำงานได้ดีดูเหมือนว่าฉันจะต้องออกจาก
Junit

ฉันแค่คิดว่า JUnit เริ่ม JVM ใหม่เมื่อคุณเรียกใช้บางอย่างเป็นการทดสอบหน่วย นั่นหมายความว่ามันใช้ classpath ที่แตกต่างจากโครงการของคุณในบางครั้ง บางครั้งในการดีบักสิ่งเหล่านี้ฉันพิมพ์คลาสพา ธ java ออกจากโค้ดของฉันดังนั้นฉันจึงสามารถเปรียบเทียบความแตกต่างเมื่อดำเนินการได้ java-tips.org/java-se-tips/java.lang/…
Logan

1

หากปัญหานี้เกิดขึ้นในโครงการ RCP อาจเป็นเพราะมีการนำเข้า JUnit อย่างชัดเจน

ตรวจสอบตัวแก้ไขสำหรับแท็บplugin.xmlภายใต้ของคุณDependenciesลบออกorg.junitจากแพ็คเกจที่นำเข้าและเพิ่มลงorg.junitในปลั๊กอินที่จำเป็น


1

ปัญหาคือเมื่อคุณตั้งค่าคราสจะชี้ไปที่JREแทนJDK JRE มีjunit4.jarในlib/extโฟลเดอร์ แต่ไม่hamcrest.jar:) ดังนั้นวิธีการแก้ปัญหาคือการตรวจสอบการติดตั้งใน JREs คราสลบที่มีอยู่และสร้างขึ้นมาใหม่เพื่อชี้ของคุณJDK


1

วิธีที่ง่ายที่สุดในการแก้ปัญหาในการเริ่มต้นคือการคัดลอก hamcrest-code.jar เวอร์ชันล่าสุดไปยัง CLASSPATH ของคุณซึ่งเป็นไฟล์ที่คุณจัดเก็บไฟล์. jar อื่น ๆ ที่จำเป็นสำหรับการคอมไพล์และเรียกใช้แอปพลิเคชันของคุณ

ซึ่งอาจเป็นเช่น: C: / ant / lib


1

สิ่งนี้เกิดขึ้นเมื่อคุณเรียกใช้ Ant ผ่านบรรทัดคำสั่ง การอ้างอิงผู้ใช้โดยนัยจะถูกเพิ่มใน classpath ในตอนท้ายและมีความสำคัญเหนือ classpath ที่เพิ่มโปรเจ็กต์ เรียกใช้ Ant ด้วย-nouserlibธง การอ้างอิงโดยนัยจะถูกแยกออกจาก classpath


1

มีคำตอบที่ดีกว่าในการแก้ปัญหานี้ เพิ่มการพึ่งพา

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

0

ฉันมีปัญหาเดียวกันวิธีแก้คือเพิ่ม build path / plugin ที่ jar org.hamcrest.core_1xx คุณสามารถค้นหาได้ใน eclipse / plugins


0

ไม่กี่ขั้นตอนที่คุณต้องปฏิบัติตาม:

  • คลิกขวาที่โครงการ
  • เลือกสร้างเส้นทางจากนั้นจากเมนูเลือกเพิ่มไลบรารี
  • เลือก JUnit จากนั้นคลิกถัดไป
  • เลือก JUnit4 แล้วเลือก Finish

นี่ใช้ได้กับฉัน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.