Chia sẻ src / lớp kiểm tra giữa các mô-đun trong một dự án maven nhiều mô-đun


120

Tôi có một dự án Maven nhiều mô-đun. Vì lợi ích của ví dụ này, hãy xem xét hai mô-đun:

  • data
  • consumer

Mô-đun consumercó mô-đun datanhư một phụ thuộc.

Mô-đun datakhai báo một loạt các lớp lõi. Có những bài kiểm tra src/testsử dụng chúng. Các bài kiểm tra này yêu cầu một số tạo đối tượng dài dòng, vì vậy tôi có một lớp với một số phương thức tiện ích trong đó để tạo các đối tượng này. Lớp tiện ích ( SampleDataHelper) này nằm trong src/testhệ thống phân cấp.

Tôi cũng có một số bài kiểm tra trong consumermô-đun cần tạo một số đối tượng dài dòng này. Tôi muốn sử dụng SampleDataHelperlớp của mình (được định nghĩa trong data src/test) trong các bài kiểm tra nằm trong consumer src/testcây của tôi . Thật không may, mặc dù datalà một phụ thuộc của consumer, consumerkhông thể thấy các lớp tồn tại bên dưới data src/test.

Để chống lại điều này, tôi nghĩ mình có thể tạo một mô-đun khác ( data-test) và chuyển SampleDataHelperđến nó bên dưới src/main. Sau đó, tôi sẽ bao gồm data-testnhư một phụ thuộc phạm vi thử nghiệm của data. Thật không may, điều này giới thiệu một phụ thuộc vòng tròn: datasử dụng data-test, nhưng data-testcũng yêu cầu data.

Giải pháp duy nhất tôi đã đi lên với là nơi SampleDataHelperdưới data src/maindưới một testgói và hy vọng rằng không có mã số ứng dụng thực tế bao giờ gọi nó.

Làm cách nào tôi có thể chia sẻ SampleDataHelperlớp học của mình giữa các học phần mà không cần đặt nó bên dưới src/main?


1
Kiểm tra câu trả lời này . Tôi nghĩ rằng nó sẽ giúp bạn.
Andrew Logvinov


@AndrewLogvinov: câu trả lời được liên kết của bạn có yêu cầu xây dựng "hai bước" không? Đầu tiên phải xây dựng và triển khai một mô-đun ( data) trước khi tôi thậm chí có thể biên dịch mô-đun thứ hai của mình ( consumer).
Greg Kopff

Tôi nghĩ rằng bạn có thể gặp một số vấn đề nếu bạn sử dụng mvn package, nhưng nó sẽ hoạt động tốt trong xây dựng một bước duy nhất khi bạn sử dụng mvn installhoặc mvn deploy. Chỉ cần một ghi chú nhanh chóng. Trong một trong những dự án lớn của chúng tôi, chúng tôi có một phần mềm bao bọc bên ngoài TestBasevà nó nằm trong src/mainđó tôi cũng không cho là một ý tưởng hay.
Andrew Logvinov

Câu trả lời:


152

Dự án Người tiêu dùng của bạn phụ thuộc vào dự án Dữ liệu của bạn, do đó, chúng tôi rất vui vì Dữ liệu phải được xây dựng trước Người tiêu dùng. Do đó, bằng cách sử dụng các kỹ thuật được đề xuất trong các nhận xét , tôi sẽ đảm bảo dự án Dữ liệu của bạn chứa tất cả mã thử nghiệm mà bạn muốn chia sẻ và định cấu hình POM để tạo ra một JAR thử nghiệm:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Dự án Người tiêu dùng của bạn sau đó sẽ phụ thuộc vào cả cấu phần Data JAR thông thường, cộng với cấu phần bổ sung test-jar, với phạm vi thử nghiệm tất nhiên:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

Tôi đã sử dụng cách tiếp cận này nhiều lần và nó hoạt động tốt.


1
liên quan đến "Dự án Người tiêu dùng của bạn sau đó sẽ phụ thuộc vào cả phần tạo tác Data JAR bình thường, cộng với phần tạo tác bình thử nghiệm bổ sung", khi tôi thêm cả phần phụ thuộc của dữ liệu vào người tiêu dùng (giả sử các phần tử tạo tác của tôi có tên là dữ liệu & người tiêu dùng) pom, mà không có thông số kỹ thuật phiên bản cụ thể, pom bị lỗi. Tại sao điều đó xảy ra?
Johnny

@StasS có lẽ tốt nhất bạn nên mở một câu hỏi riêng về điều đó.
Duncan Jones

Đã làm được không :) stackoverflow.com/questions/32119591/…
Johnny

1

Vậy vấn đề là (một số) bài kiểm tra trong học phần có dataphụ thuộc vào SampleDataHelperlớp hay không? Bạn có thể di chuyển SampleDataHelperlớp đến src/maincủa data-testmô-đun, nếu bạn đồng thời di chuyển các bài kiểm tra (phụ thuộc vào lớp cụ thể) sang lớp src/testcủa data-testmô-đun. Do đó, sẽ không còn phụ thuộc vòng tròn nữa.


1
Nếu tôi hiểu bạn, bạn đang đề xuất rằng bất kỳ bài kiểm tra nào sử dụng SampleDataHelperđược chuyển từ datamô-đun hoặc consumermô-đun (nếu thích hợp) vào data-test. Thật không may, tôi không thấy đây là một giải pháp quá "gọn gàng" vì nó chuyển các bài kiểm tra của tôi ra khỏi mô-đun mà chúng kiểm tra và sang một mô-đun khác. (Nói một cách chính xác, bạn chỉ nói di chuyển các databài kiểm tra, nhưng tôi nghĩ tôi sẽ thấy mình di chuyển cả hai để có sự nhất quán). Nhưng cảm ơn bạn đã trả lời. :-)
Greg Kopff

1
Đúng, bạn đã hiểu tôi đúng. Và có thể nói, đó là một giải pháp nhanh chóng hơn là một giải pháp gọn gàng. :-)
matsev

Tôi sẽ tưởng tượng các phụ thuộc vòng tròn sẽ vẫn còn. Giả sử rằng các bài kiểm tra trong câu hỏi thực hiện các lớp được xác định trong dự án Dữ liệu, vẫn cần có một tham chiếu trở lại dự án Dữ liệu từ dự án Kiểm tra dữ liệu.
Duncan Jones

1
@DuncanJones Xin lỗi, có một lỗi đánh máy nhỏ trong bài đăng của tôi. Điểm tôi đang cố gắng đưa ra là data-testmô-đun phải phụ thuộc vào datamô-đun (và không phải ngược lại). Để tránh sự phụ thuộc vòng tròn, tất cả các bài kiểm tra hiện nằm trong datamô-đun sử dụng SampleDataHelperphải được chuyển sang data-testmô-đun.
matsev

Gotcha, điều đó có ý nghĩa hơn.
Duncan Jones
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.