Mô-đun Maven + Xây dựng một mô-đun cụ thể duy nhất


383

Tôi có một dự án Maven đa mô-đun với một dự án cha mẹ Pvà ba phụ module A, BC. Cả hai BClà các dự án chiến tranh và cả hai đều phụ thuộc vào A.

Tôi có thể gõ mvn compiletrong Pvà có tất cả các sub-module biên soạn đúng cách. Vấn đề xảy ra khi tôi muốn thực hiện các thao tác cho các mô-đun cụ thể.

Tôi muốn có thể đóng gói một cuộc chiến cho dự án B, nhưng khi tôi chạy lệnh gói từ Bthư mục của nó, nó phàn nàn rằng nó không thể tìm thấy các phụ thuộc cho A.

Tôi hiểu từ câu hỏi này: Maven và các mô-đun phụ thuộc mà có lẽ Maven không thực sự được thiết kế cho loại độ phân giải phụ thuộc này, nhưng điều đó đặt ra câu hỏi làm thế nào để tôi đóng gói B?

  1. Tôi có phải chạy mvn packagecho toàn bộ hệ thống phân cấp dự án khi tôi thực sự chỉ muốn Bkhông?

  2. Tôi có phải cài đặt ảnh chụp nhanh của A vào kho lưu trữ cục bộ của mình mỗi lần tôi muốn đóng gói Bkhông?

Kịch bản thứ hai này không thú vị lắm khi Avẫn đang được phát triển tích cực.

Bất kỳ thực hành tốt nhất ở đây?


bản sao có thể có của Maven và các mô-đun phụ thuộc
oberlies

Câu trả lời:


694

Bất kỳ thực hành tốt nhất ở đây?

Sử dụng các tùy chọn lò phản ứng nâng cao Maven , cụ thể hơn:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Vì vậy, chỉ cần cdvào thư mục P cha và chạy:

mvn install -pl B -am

Và điều này sẽ xây dựng B và các mô-đun theo yêu cầu của B.

Lưu ý rằng bạn cần sử dụng dấu hai chấm nếu bạn đang tham chiếu một artifactIdtên khác với tên thư mục:

mvn install -pl :B -am

Như được mô tả ở đây: https://stackoverflow.com/a/26439938/480894


15
Đối với bất kỳ ai nhấn trang này vào năm 2011, đây là câu trả lời tốt hơn. Hiện tại đã hỗ trợ tốt hơn cho nhiều mô-đun trong chính maven (Maven 2.1 trở lên), bạn không cần sử dụng plugin lò phản ứng.
Spedge

17
Một tùy chọn rất hữu ích khác là "-amd, --also-make-Depents", xây dựng tất cả các mô-đun phụ thuộc vào các dự án trong danh sách lò phản ứng.
răn đe

1
Còn việc xây dựng một mô-đun cháu?
Bax

12
@Bax, sử dụng mvn install -pl .,parent/child,parent/child/grandchild Sử dụng dấu phẩy để phân tách nhiều dự án và. cho cha mẹ pom
Neo

1
Khi tôi cố gắng clean packagemô-đun theo cách này, nó không thể giải quyết các phụ thuộc lò phản ứng chưa được cài đặt. Với -amnó sẽ không cần thiết xây dựng lại các deps.
lưu vực

18

Say pom.xml Chánh chứa 6 module và bạn muốn chạy Một , BF .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd vào dự án mẹ

 mvn --projects A,B,F --also-make clean install

HOẶC LÀ

mvn -pl A,B,F -am clean install

HOẶC LÀ

mvn -pl A,B,F -amd clean install

Lưu ý: Khi bạn chỉ định một dự án với tùy chọn -am , Maven sẽ xây dựng tất cả các dự án mà dự án được chỉ định phụ thuộc (trực tiếp hoặc gián tiếp). Maven sẽ kiểm tra danh sách các dự án và đi xuống cây phụ thuộc, tìm tất cả các dự án mà nó cần để xây dựng.

Trong khi lệnh -am tạo ra tất cả các dự án được yêu cầu bởi một dự án cụ thể trong bản dựng đa mô-đun, tùy chọn -amd hoặc --also-make-Depents cấu hình Maven để xây dựng dự án và bất kỳ dự án nào phụ thuộc vào dự án đó. Khi sử dụng --also-make-Depents , Maven sẽ kiểm tra tất cả các dự án trong lò phản ứng của chúng tôi để tìm các dự án phụ thuộc vào một dự án cụ thể. Nó sẽ tự động xây dựng các dự án đó và không có gì khác.


8

Maven hoàn toàn được thiết kế cho loại phụ thuộc này.

mvn package sẽ không cài đặt bất cứ thứ gì trong kho lưu trữ cục bộ của bạn, nó chỉ đóng gói dự án và để nó trong thư mục đích.

Thực hiện mvn installtrong dự án mẹ (A), với điều này, tất cả các mô-đun phụ sẽ được cài đặt trong kho lưu trữ Maven của máy tính của bạn, nếu không có thay đổi nào bạn chỉ cần biên dịch / đóng gói mô-đun phụ (B) và Maven sẽ lấy gói đã được đóng gói và cài đặt phụ thuộc vừa phải.

Bạn chỉ cần một mvn installdự án mẹ nếu bạn cập nhật một phần mã.


3
Nó sẽ là một cơn ác mộng trong quá trình phát triển, hình ảnh rằng một khi bạn sửa lỗi trong mô-đun phụ, bạn sẽ cài đặt nó, và sau đó bạn khởi động thùng chứa servlet. Cuộc sống rất ngắn ngủi :(
hguser

7

Nếu trước đây bạn đã chạy cài đặt mvn trên dự án B, nó sẽ được cài đặt vào kho lưu trữ cục bộ của bạn, vì vậy khi bạn xây dựng gói A Maven có thể giải quyết sự phụ thuộc. Vì vậy, miễn là bạn cài đặt dự án B mỗi khi bạn thay đổi, bản dựng của bạn cho dự án A sẽ được cập nhật.

Bạn có thể định nghĩa một dự án đa mô-đun với một pom tổng hợp để xây dựng một tập hợp các dự án.

Cũng đáng nói đến m2eclipse , nó tích hợp Maven vào Eclipse và cho phép bạn (tùy chọn) giải quyết các phụ thuộc từ không gian làm việc. Vì vậy, nếu bạn đang hack nhiều dự án, nội dung không gian làm việc sẽ được sử dụng để biên dịch. Khi bạn hài lòng với các thay đổi của mình, hãy chạy cài đặt mvn (lần lượt trên từng dự án hoặc sử dụng bộ tổng hợp) để đưa chúng vào kho lưu trữ cục bộ của bạn.


1
Có cách nào dễ dàng để đảm bảo rằng tất cả các dự án phụ thuộc cho dự án mục tiêu của tôi đã được cài đặt không? Hệ thống phân cấp tôi có thực sự phức tạp hơn nhiều so với mô tả ở đây, vì vậy hãy cố gắng nhớ nếu tôi chạy cài đặt mvn cho từng dự án phụ thuộc vì lần thay đổi mã cuối cùng của tôi có thể khó khăn.
Brian Ferris

Có, sử dụng các mô-đun để xây dựng tập hợp các dự án, xem liên kết được thêm vào câu trả lời ban đầu.
Người bán giàu

5

Hãy xem câu trả lời của tôi Maven và các mô-đun phụ thuộc .

Các plugin Maven Reactor được thiết kế để đối phó với việc xây dựng một phần của một dự án.

Mục tiêu cụ thể bạn sẽ muốn sử dụng nó reactor:make.


3
Đây từng là câu trả lời đúng, nhưng với Maven 2.1, bạn không còn cần phải sử dụng plugin lò phản ứng. Hãy xem câu trả lời của Pascal trong chủ đề này liên quan đến "Tùy chọn lò phản ứng nâng cao"
Spedge

3

Bạn nói bạn "thực sự chỉ muốn B", nhưng điều này là sai. Bạn muốn B, nhưng bạn cũng muốn cập nhật A nếu có bất kỳ thay đổi nào đối với nó ("phát triển tích cực").

Vì vậy, đôi khi bạn muốn làm việc với A, B và C. Trong trường hợp này, bạn có dự án tổng hợp P. Đối với trường hợp bạn muốn làm việc với A và B (nhưng không muốn C), bạn nên tạo dự án tổng hợp Q .

Chỉnh sửa 2016 : Thông tin trên có lẽ có liên quan trong năm 2009. Kể từ năm 2016, tôi đặc biệt khuyên bạn nên bỏ qua điều này trong hầu hết các trường hợp và chỉ cần sử dụng cờ -amhoặc -pldòng lệnh như được mô tả trong câu trả lời được chấp nhận. Nếu bạn đang sử dụng phiên bản maven từ trước v2.1, hãy thay đổi phiên bản đó trước :)


Grmphh ... sau đó tôi sẽ kết thúc với nhiều dự án tổng hợp như các dự án.
Kris

@Kris Tôi sẽ không còn đề nghị này. Tôi sẽ để nó ở đây trong trường hợp ai đó vẫn muốn biết làm thế nào, nhưng tôi luôn sử dụng cờ -am và -pl bây giờ. Tôi đã cập nhật câu trả lời của mình.
Zac Thompson
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.