java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribe


110

Trong khi chạy junitthử nghiệm, eclipsetôi nhận được điều này Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Tôi đã thêm junit.jartệp thư viện.

Tôi đã thử các phiên bản khác nhau của junit.jar: 4.4, 4.8vv

Làm cách nào để khắc phục Ngoại lệ này?


Theo mô tả của bạn, junit.jarkhông liên quan đến các vấn đề
Andremoniy

1
Trong harcrestbình, hệ thống phân cấp có giống nhau không? như trong org > hamcrest > SelfDescribing, hay nó nằm trong thư mục gốc của jar?
Danyel


1
lỗi này có thể không được cho jar junit, có lẽ một cái gì đó trong dự án cần jar khác của bạn, ở đây có một số org.hamcrest.SelfDescribing - được biết đến phiên bản
jdurango

1
Cảm ơn nhưng tôi không có bất cứ thứ gì khác trong dự án, tôi đã tạo dự án mới này.
user2013948

Câu trả lời:


92

Thêm hamcrest-all-X.X.jarvào classpath của bạn .

Phiên bản mới nhất kể từ tháng 2 năm 2015 là 1.3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=


2
Làm cách nào để thêm nó vào classpath hoặc kiểm tra xem nó đã được thêm hay chưa?
Tomáš Zato - Phục hồi Monica

Đồng ý, làm thế nào để làm điều đó sẽ hữu ích. May mắn bình luận bên dưới có nó.
MarkII

@ TomášZato đầu tiên: kiểm tra tệp. đó là hamcrest-all (điều quan trọng là phải có được tất cả ). Trong Idea-IDEs, một phụ thuộc được thêm vào 1. sao chép / dán tệp vào thư mục libs (hoặc bất kỳ nơi nào khác) 2. nhấp chuột phải vào tệp "thêm làm thư viện" 3. kiểm tra các câu lệnh nhập trong tệp .java-files của bạn.
Martin Pfeffer

hamcrest-all-X.X.jarlà đủ trong khi nhỏ hơn nhiều.
Elist

1
Tệp --- Cấu trúc dự án --- Thư viện --- '+' --- Java --- .... jar (bạn đã tải xuống) --- OK, nó sẽ hiển thị trong 'thư viện bên ngoài'.
Simon Z.

56

Theo trang web của nhóm JUnit GitHub ( https://github.com/junit-team/junit/wiki/Download-and-Install ), junit.jarhamcrest-core.jarcả hai đều cần thiết trong classpath khi sử dụng JUnit 4.11.

Đây là khối phụ thuộc Maven để bao gồm junit và 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>

Tôi đang phải đối mặt với điều này trong Junit 5 mặc dù nó là nghĩa vụ phải làm việc mà không có nó
Nikhil Sahu

22

Một số bước bạn phải làm theo:

  1. Nhấp chuột phải vào dự án.
  2. Chọn Build Path Sau đó từ menu của nó, chọn Add Libraries.
  3. Chọn JUnit rồi nhấp vào Tiếp theo.
  4. Chọn JUnit4 rồi Hoàn tất.

1
CÁi này đã sửa nó giúp tôi. Đối với những người không quen sử dụng java / Eclipse, điều này cực kỳ hữu ích. Tôi cũng muốn đề cập rằng các phòng thí nghiệm do Người hướng dẫn của tôi cung cấp cho lớp học có phiên bản Junit (có thể là 3) không hoạt động với Phòng thí nghiệm / phiên bản Eclipse của tôi. Tôi đã phải loại bỏ nó và thêm 4 và tất cả đều tốt bây giờ. Cảm ơn rất nhiều.
Tony

Điều này không hoạt động khi bạn đang chạy bản dựng bằng dấu nhắc lệnh. Đây là giải pháp duy nhất của "IDE".
Partha

16

Hoạt động cho tôi: IntelliJ IDEA 13.1.1, JUnit4, Java 6

Tôi đã thay đổi tệp trong đường dẫn dự án: [PROJECT_NAME] .iml

Đã thay thế:

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

Bởi:

  <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>

Vì vậy, tệp .iml cuối cùng là:

<?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: lưu tệp và không để IntelliJ Idea tải lại tệp. Chỉ một lần.


Siêu tuyệt vời !! Giúp tôi với dự án hiện tại của tôi.
MarkII

4

Bạn cần junit-dep.jar vì junit.jar có một bản sao của các lớp Hamcrest cũ.


3

Sự cố này là do classpath của bạn bỏ lỡ hamcrest-core-1.3.jar. Để giải quyết vấn đề này, hãy thêm hamcrest-core-1.3.jar khi bạn thêm junit-4.XX.jar vào classpath của mình.

Lúc đầu, tôi cũng gặp sự cố này, nhưng sau khi tôi tham khảo trang web chính thức và thêm hamcrest-core-1.3.jar vào classpath bằng dòng lệnh, cuối cùng thì nó cũng hoạt động bình thường.

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

Theo nguyên tắc chung, hãy luôn đảm bảo rằng hamcrest có trước bất kỳ thư viện thử nghiệm nào khác trên classpath, vì nhiều thư viện như vậy bao gồm các lớp hamcrest và do đó có thể xung đột với phiên bản hamcrest bạn đang sử dụng. Điều này sẽ giải quyết hầu hết các vấn đề của loại bạn đang mô tả.


2

Đề phòng có ai ở đây đang sử dụng netbeans và gặp vấn đề tương tự, tất cả những gì bạn phải làm là

  • Nhấp chuột phải vào TestLibraries
  • Nhấp vào Thêm thư viện
  • Chọn JUnit và nhấp vào thêm thư viện
  • Lặp lại quá trình nhưng lần này nhấp vào Hamcrest và nhấp vào thêm thư viện

Điều này sẽ giải quyết vấn đề


Cảm ơn bạn, điều này làm việc cho tôi. Tôi đã có thư viện JUnit nhưng tôi thiếu Hamcrest.
S. Mayol


1

Nó giống như một vấn đề classpath, vì vậy có một số cách khác nhau để giải quyết vấn đề này. Org / hamcret / SelfDescribe đến từ đâu? Đó là lớp học của bạn hay trong một cái lọ khác?

Hãy thử đi tới Đường dẫn xây dựng dự án của bạn và trên tab Thư viện, hãy thêm Thư viện. Bạn sẽ có thể chọn JUnit cho dự án của mình. Điều này hơi khác một chút so với việc chỉ có tệp jar JUnit Trong dự án của bạn.

Trong Cấu hình Chạy của bạn cho thử nghiệm JUnit, hãy kiểm tra Đường dẫn phân cách. Bạn có thể khắc phục điều này bằng cách thêm đảm bảo rằng Classpath của bạn có thể thấy lớp Tự đăng ký đó ở đó. Tùy chọn Run trong Eclipse có một tập hợp các tùy chọn khác nhau cho các tùy chọn JUnit.


nó không phải là vấn đề của classpath vì tôi đã thêm tệp thư viện junit trong đường dẫn xây dựng, ngay cả trong thư viện junit có một tham chiếu đến hamcrest tức là C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948

Cảm ơn phản hồi của bạn, testNG đang hoạt động tốt, có vẻ như tôi sẽ phải thoát khỏi vào
user2013948

Tôi chỉ nghĩ rằng JUnit thực sự bắt đầu một JVM mới khi bạn chạy một cái gì đó như một bài kiểm tra đơn vị. Điều đó có nghĩa là nó đôi khi sử dụng một classpath khác với dự án của bạn. Đôi khi để gỡ lỗi những thứ này, tôi in java classpath ra khỏi mã của mình, vì vậy tôi có thể so sánh sự khác biệt khi nó thực thi. java-tips.org/java-se-tips/java.lang/…
Logan

1

Nếu vấn đề này phát sinh trong một dự án RCP thì có thể do JUnit đã được nhập rõ ràng.

Kiểm tra trình chỉnh sửa cho tab plugin.xmldưới của bạn Dependencies, xóa org.junitkhỏi Gói đã nhập và thêm org.junitvào Trình cắm bắt buộc.


1

Vấn đề là khi bạn thiết lập nhật thực để trỏ đến JRE thay vì JDK . JRE có junit4.jartrong lib/extthư mục, nhưng không phải hamcrest.jar:) Vì vậy, giải pháp là kiểm tra các JRE đã cài đặt trong Eclipse, xóa cái hiện có và tạo một cái mới trỏ đến JDK của bạn .


1

cách đơn giản nhất để giải quyết vấn đề bắt đầu là sao chép phiên bản mới nhất của hamcrest-code.jar vào CLASSPATH của bạn, đây là tệp bạn lưu trữ các tệp .jar khác cần thiết để biên dịch và chạy ứng dụng của bạn.

đó có thể là ví dụ: C: / ant / lib


1

Điều này xảy ra khi bạn chạy Ant qua dòng lệnh. Các phụ thuộc người dùng ngầm định được thêm vào trong classpath ở cuối và được ưu tiên hơn classpath do dự án thêm vào. Chạy Ant với -nouserlibcờ. Các phụ thuộc ngầm định sẽ bị loại trừ khỏi classpath.


1

Có một câu trả lời tốt hơn để giải quyết vấn đề này. thêm sự phụ thuộc

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

0

Tôi gặp vấn đề tương tự, giải pháp là thêm vào đường dẫn xây dựng / plugin jar org.hamcrest.core_1xx, bạn có thể tìm thấy nó trong eclipse / plugins.


0

Một số bước bạn phải làm theo:

  • Nhấp chuột phải vào dự án.
  • Chọn Build Path & sau đó từ menu của nó, chọn Add Libraries.
  • Chọn JUnit rồi nhấp vào Tiếp theo.
  • Chọn JUnit4 rồi Hoàn tất.

Điều này làm việc cho tôi ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.