Vấn đề biên dịch Maven 3 và JUnit 4: package org.junit không tồn tại


80

Tôi đang cố gắng xây dựng một dự án Java đơn giản với Maven. Trong tệp pom của tôi, tôi khai báo JUnit 4.8.2 là phần phụ thuộc duy nhất. Maven vẫn khăng khăng sử dụng JUnit phiên bản 3.8.1. Làm thế nào để tôi sửa chữa nó?

Vấn đề thể hiện ở lỗi biên dịch: "package org.junit không tồn tại". Điều này là do câu lệnh nhập trong mã nguồn của tôi. Tên gói chính xác trong JUnit 4. * là org.junit. * Trong khi ở phiên bản 3. * là junit.framework. *

Tôi nghĩ rằng tôi đã tìm thấy tài liệu về gốc rễ của vấn đề trên http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html nhưng lời khuyên ở đó dường như dành cho các chuyên gia Maven. Tôi không hiểu phải làm gì.


21
Tôi chưa làm việc với Maven 3, nhưng suy đoán đầu tiên của tôi sẽ là lớp thử nghiệm của bạn nằm trong src / main / java và POM của bạn xác định junit là phụ thuộc thử nghiệm (nghĩa là giá trị của phần tử "phạm vi" là "thử nghiệm "). Tuy nhiên, tôi không thể nói chắc chắn nếu không nhìn thấy POM của bạn và biết cấu trúc dự án của bạn.
Sarah Roberts

2
Maven không nhấn mạnh vào JUnit rằng người thực hiện phải là bạn ... có vẻ như bạn đã không định vị các lớp Kiểm tra của mình vào đúng vị trí src / test / java ... và tất nhiên pom sẽ cực kỳ hữu ích.
khmarbaise

Câu trả lời:


52

Chỉ để có câu trả lời với giải pháp hoàn chỉnh để giúp khách truy cập:

Tất cả những gì bạn cần làm là thêm phụ thuộc junit vào pom.xml. Đừng quên<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

1
Có, phiên bản của junit của bạn rất quan trọng. Tôi đã nâng cấp nó từ 3.8.1 lên 4.11 và nó đã giải quyết được sự cố của tôi.
Mahsa2

đã thay đổi nó từ 3.11 thành 4.11 và nó cũng hoạt động, nhưng tôi tự hỏi điều đó sẽ xảy ra như thế nào đối với phiên bản trước đó.
Tiina

45

@Dennis Roberts: Bạn hoàn toàn đúng: Lớp thử nghiệm của tôi nằm trong src / main / java. Ngoài ra, giá trị của phần tử "scope" trong POM cho JUnit là "test", mặc dù đó là cách nó được cho là như vậy. Vấn đề là tôi đã cẩu thả khi tạo lớp thử nghiệm trong Eclipse, dẫn đến việc nó được tạo trong src / main / java chèn thêm src / test / java. Điều này trở nên dễ thấy hơn trong chế độ xem Project Explorer của Eclipse sau khi chạy "mvn eclipse: eclipse", nhưng nhận xét của bạn là điều khiến tôi nhìn thấy nó đầu tiên. Cảm ơn.


Tôi đã di chuyển một số tệp từ thử nghiệm sang tệp chính và Phần bổ sung mới của tôi bắt đầu gặp lỗi. Xóa <scope> kiểm tra </scope> đã giải quyết được sự cố. Cảm ơn!
pMan

tôi đã chuyển một tệp Kiểm tra từ tệp chính sang tệp thử nghiệm. Sau đó, maven biên dịch thành công với thử nghiệm junit <scope> </scope>. Cảm ơn rất nhiều
eleforest 30/09/13

Không thể tin được, tôi đã có cùng một vấn đề. Và vì Jenkins không quan tâm đến bài kiểm tra của tôi trong src / main nên tôi thậm chí còn không nhận thấy.
Pieter De Bie

19

vấn đề của tôi là một dòng bên trong của pom.xmltôi, tôi có dòng <sourceDirectory>${basedir}/src</sourceDirectory>xóa dòng này làm maven sử dụng các thư mục cấu trúc thông thường giải quyết vấn đề của tôi


1
Nó làm việc cho tôi sau khi gỡ bỏ <sourceDirectory> src << sourceDirectory> làm việc của nó
Prashant thakre

12

xóa thẻ phạm vi trong pom.xml cho junit đã hoạt động ..


4
Giải pháp này không tốt, bởi vì bây giờ bạn đang gửi các lớp thử nghiệm junit của bạn vào nhị phân sản phẩm của bạn.
avgvstvs


4

Tôi đã từng gặp vấn đề tương tự. Tất cả những gì tôi đã làm là - Từ tệp pom.xml, tôi đã xóa phụ thuộc cho junit 3.8 và thêm một phụ thuộc mới cho junit 4.8. Sau đó, tôi đã làm sạch maven và cài đặt maven. Nó đã thành công. Để xác minh, sau khi cài đặt maven, tôi đã truy cập dự án-> thuộc tính-xây dựng đường dẫn-> phụ thuộc maven và thấy rằng bây giờ jar junit 3.8 đã biến mất !, thay vào đó là jar junit 4.8 được liệt kê. mát mẻ!!. Bây giờ thử nghiệm của tôi chạy như một cái duyên .. Hy vọng điều này sẽ giúp bằng cách nào đó ..


Có, nhưng câu trả lời của @ FrVaBe khiến khi đồng nghiệp của bạn nhận được mã của bạn (và pom.xml của bạn), họ sẽ không phải tìm ra giải pháp của bạn nữa. Nó sẽ hoạt động chính xác.
Russ Bateman

4

Trường hợp của tôi là một giám sát đơn giản.

Tôi đặt bên trong khai phụ thuộc JUnit <dependencies>dưới <dependencyManagement/>nút thay vì <project/>trong file POM. Cách đúng là:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>

4

Bạn đã khai báo phiên bản như thế nào?

<version>4.8.2</version>

Hãy biết ý nghĩa của tuyên bố này được giải thích ở đây (xem LƯU Ý) :

Khi khai báo phiên bản "bình thường" chẳng hạn như 3.8.2 cho Junit, nội bộ điều này được biểu thị là "cho phép bất cứ điều gì, nhưng thích 3.8.2 hơn." Điều này có nghĩa là khi phát hiện xung đột, Maven được phép sử dụng các thuật toán xung đột để chọn ra phiên bản tốt nhất. Nếu bạn chỉ định [3.8.2], điều đó có nghĩa là chỉ 3.8.2 sẽ được sử dụng và không có gì khác.

Để buộc sử dụng phiên bản 4.8.2, hãy thử

<version>[4.8.2]</version>

Vì bạn không có bất kỳ phụ thuộc nào khác trong dự án của mình nên sẽ không có bất kỳ xung đột nào gây ra sự cố của bạn. Khai báo đầu tiên sẽ phù hợp với bạn nếu bạn có thể lấy phiên bản này từ kho lưu trữ. Bạn có thừa kế các phụ thuộc từ một pom mẹ không?


1
Sẽ không <version>[4.8.2,)</version>tốt hơn nếu buộc ít nhất là phiên bản đó?
Joachim Sauer

3
@Joachim Sauer Sử dụng phạm vi phiên bản hiện cũng giải quyết các phiên bản SNAPSHOT ( liên kết ) - và việc thảo luận rất tranh cãi nếu đó là một khái niệm hay. Nếu bạn không phiền muốn tải phiên bản SNAPSHOT, gợi ý của bạn khá hữu ích.
FrVaBe

3

Tôi đã có các tệp của mình ở đúng vị trí và chỉ cần xóa <scope>test</scope>khỏi mục nhập phụ thuộc JUnit đã giải quyết được vấn đề (Tôi đang sử dụng JUnit 4.12). Tôi tin rằng với testphạm vi, sự phụ thuộc chỉ bị bỏ qua trong giai đoạn biên dịch. Bây giờ mọi thứ đang hoạt động ngay cả khi tôi gọi mvn test.


3

Tôi đã gặp sự cố khá tương tự trong một dự án "test-utils" (thêm các tính năng, quy tắc và xác nhận vào JUnit) con của một dự án mẹ đưa vào các phụ thuộc. Lớp phụ thuộc vào gói org.junit.rules nằm trong src / main / java.

Vì vậy, tôi đã thêm một phụ thuộc vào junit mà không có phạm vi kiểm tra và nó đã giải quyết được vấn đề:

pom.xml của dự án thử nghiệm-dùng:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

pom.xml của dự án mẹ:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>

1

Tôi đã gặp vấn đề tương tự về việc Eclipse biên dịch mã của tôi tốt nhưng Maven đã thất bại khi biên dịch các bài kiểm tra mọi lúc mặc dù thực tế JUnit nằm trong danh sách các phụ thuộc của tôi và các bài kiểm tra nằm trong / src / test / java /.

Trong trường hợp của tôi, tôi đã có phiên bản JUnit sai trong danh sách các phụ thuộc của mình. Tôi đã viết các bài kiểm tra JUnit4 (với chú thích) nhưng có JUnit 3.8.x làm phụ thuộc của tôi. Giữa phiên bản 3.8.x và 4 của JUnit, họ đã thay đổi tên gói từ junit.framework thành org.junit, đó là lý do tại sao Maven vẫn không biên dịch bằng cách sử dụng jar JUnit.

Tôi vẫn không hoàn toàn chắc chắn tại sao Eclipse được biên dịch thành công. Nó phải có bản sao JUnit4 của chính nó ở đâu đó trong classpath. Hy vọng giải pháp thay thế này hữu ích cho mọi người. Tôi đã đạt được giải pháp này sau khi theo liên kết của Arthur ở trên.


1

Tôi cũng gặp phải vấn đề này - tôi đang cố gắng lấy một đối tượng từ một nguồn và nó đang hoạt động trong mã thử nghiệm nhưng không phải mã src. Để kiểm tra thêm, tôi đã sao chép một khối mã từ bài kiểm tra và thả nó vào mã src, sau đó ngay lập tức loại bỏ các dòng JUnit để tôi biết cách kiểm tra đang kéo đối tượng. Sau đó, đột nhiên mã của tôi không biên dịch.
Vấn đề là khi tôi bỏ mã vào, Eclipse đã giải quyết một cách hữu ích tất cả các lớp, vì vậy tôi có các lệnh gọi JUnit đến từ mã src của tôi, mã này không phù hợp. Đáng lẽ ra, tôi đã nhận thấy các cảnh báo ở trên cùng về các hàng nhập khẩu chưa sử dụng, nhưng tôi đã bỏ qua để xem chúng.
Sau khi tôi xóa các mục nhập JUnit không sử dụng trong tệp src của mình, tất cả đều hoạt động tốt.


1

Tôi cũng gặp vấn đề tương tự như hình dưới đây.

nhập mô tả hình ảnh ở đây

Để giải quyết vấn đề, các dòng dưới đây được thêm vào dependenciesphần trong build.gradle cấp ứng dụng.

compile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'

Bản dựng Gradle sau đó đã báo cáo cảnh báo sau.

Warning:Conflict with dependency 'com.android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

Để giải quyết cảnh báo này, phần sau được thêm vào build.gradle cấp ứng dụng.

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}

0

Tìm giải pháp duy nhất cho lỗi này nếu bạn có mã trong src / main / java Utils

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>

0

Thay đổi phiên bản junit đã sửa lỗi này cho tôi. Có vẻ như phiên bản 3.8.1 không hoạt động trong trường hợp của tôi. Sự cố đã được khắc phục khi thay đổi nó thành 4.12


-1

Theo mặc định, maven xem xét các thư mục này tương ứng cho java và các lớp thử nghiệm - src / main / java và src / test / java

Khi src được chỉ định với các lớp thử nghiệm trong nguồn và phạm vi phụ thuộc junit trong pom.xml được đề cập là test - org.unit sẽ không được tìm thấy bởi maven.

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.