2013-03-14 27 views
20

phép nói rằng tôi có cấu trúc mô-đun như dưới đâyxây dựng Maven chỉ tập tin thay đổi

 Modules 
     ->utils 
     ->domain 
     ->client 
     ->services 
     ->deploy (this is at the module level) 

Bây giờ để lauch client tôi cần phải thực hiện một xây dựng của tất cả các mô-đun, i.e utils, domain, client, services, vì tôi đang tải các lọ của tất cả các bên trên mô-đun để fianlly lanch khách hàng

Và tất cả các lọ được lắp ráp trong mô-đun triển khai.

Câu hỏi của tôi là nếu tôi thay đổi bất cứ điều gì trong các dịch vụ ví dụ, sau đó là có một cách khi chạy một xây dựng từ deploy maven có thể nhận ra nó có để xây dựng chỉ services và do đó xây dựng và triển khai nó trong thư mục triển khai?

Trả lời

5

Nếu bạn đang sử dụng SVN và * nix, từ các module gốc

mvn install -amd -pl $(svn st | colrm 1 8 | sed 's /.* ' | xargs echo | sed 's- -,:-g' | sed 's^: ') 
+1

Bạn có thể cho tôi một ví dụ - để tôi có thể làm tương tự cho git! – smilyface

+0

Ai đó có thể thêm giải thích ngắn gọn về suy nghĩ đằng sau chuỗi lệnh này không? –

+0

mọi thứ bên trong '$()' được gọi đầu tiên: ** 1 ** 'svn st' để liệt kê tất cả các dự án đã sửa đổi ** 2 **' colrm' xóa 8 cols đầu tiên ** 3 ** 'sed' dải tất cả sau dấu gạch chéo đầu tiên ** 4 ** 'xargs echo' lấy danh sách và tạo dấu phẩy (thay vì ngắt dòng) ** 5 **' sed' thêm ':' vào cuối việc sử dụng danh sách các dự án được phân cách bằng dấu phẩy có maven – sebasjm

16

Nếu bạn chỉ gọi "cài đặt mvn" mà không "sạch", plugin trình biên dịch sẽ chỉ biên dịch các lớp đã sửa đổi.

+0

chỉ cần sử dụng mvn biên dịch Tôi nghĩ đó là ok, vì bạn chỉ muốn chạy dự án không xây dựng chiến và cũng cài đặt sẽ mất nhiều thời gian hơn. – OQJF

+0

ok kiểm tra ... – user1224036

+0

tôi nghĩ rằng bạn hiểu lầm câu hỏi của tôi ... nó muốn xây dựng với chỉ thay đổi tập tin ... tôi không muốn xây dựng lại và sao chép các lọ của mô-đun không thay đổi ..? – user1224036

9

Trong đa mô-đun xây dựng bạn có thể sử dụng:

mvn -pl ChangedModule compile 

từ các module gốc sẽ biên dịch chỉ cho ChangedModule. Plugin trình biên dịch sẽ chỉ biên dịch các tệp đã được thay đổi. Nhưng nó có thể xảy ra mà các mô-đun bạn đã thay đổi sẽ gây ra một biên dịch lại của mô-đun khác mà là tùy thuộc vào ChangedModule. Điều này có thể đạt được bằng cách sử dụng như sau:

mvn -amd -pl ChangedModule compile 

nơi -amd nghĩa cũng làm cho người phụ thuộc. Thao tác này sẽ hoạt động mà không cần cài đặt toàn bộ mô-đun vào kho lưu trữ cục bộ bằng cách mvn install.

+0

Vẫn không phải những gì tôi muốn, tôi cần một cái bình để được xây dựng, và sao chép vào một reporsitory (triển khai thư mục) của chỉ mô-đun thats thay đổi ... – user1224036

+0

Điều đó không thể thực hiện với Maven. Bạn cần tự viết kịch bản. Hoặc viết một plugin Maven thích hợp cho điều đó. Điều đó vượt ra ngoài ý tưởng của maven. – khmarbaise

0

Sau khi thử và sử dụng nói trên khuyên, tôi đã gặp vấn đề sau:

  1. Maven cài đặt (không sạch) vẫn mất rất nhiều thời gian, mà đối với một số dự án có thể được thêm 10-20 giây.
  2. Giải pháp của Sebasjm nhanh và hữu ích (tôi đã sử dụng nó trong một vài tháng), nhưng nếu bạn có nhiều dự án đã thay đổi, hãy xây dựng lại chúng mọi lúc (nếu bạn thậm chí không thay đổi bất kỳ thứ gì).

Điều gì thực sự hiệu quả đối với tôi là so sánh ngày sửa đổi nguồn với sửa đổi .jar trong kho lưu trữ cục bộ. Và nếu bạn chỉ kiểm tra VCS đã thay đổi tệp (xem câu trả lời của sebasjm), thì việc so sánh ngày tháng sẽ không mất thời gian đáng kể (đối với tôi nó nhỏ hơn 1s cho 100 tệp đã thay đổi). Lợi ích chính của cách tiếp cận như vậy là xây dựng lại rất chính xác chỉ các dự án thực sự thay đổi. Vấn đề chính là thực hiện so sánh ngày sửa đổi là nhiều hơn một chút so với tập lệnh một lớp.

Đối với những người muốn thử nó, nhưng quá lười biếng để viết kịch bản như vậy tự chia sẻ phiên bản của tôi của nó: https://github.com/bugy/rebuilder (linux/windows). Nó có thể làm một số điều hữu ích bổ sung, nhưng ý tưởng chính và thuật toán trung tâm như được giải thích ở trên.

2

tôi đã thất vọng cùng và tôi cũng đã viết một dự án vào thời điểm đó - than ôi nó không phải là có sẵn nhưng tôi tìm thấy những người thực hiện một cái gì đó tương tự:

ví dụ - https://github.com/erickzanardo/maven-watcher

Nó sử dụng nodejs và giả một dự án maven nhưng nên hoạt động trên các cửa sổ và Unix.

Ý tưởng triển khai của tôi là xem các thay đổi và sau đó biên dịch những thay đổi. - loại giống như nodemon.

Vì vậy, ví dụ

  • Khi một tập tin java thay đổi - Tôi biên dịch các module
  • Khi một tập tin lớp học hoặc jar thay đổi - tôi làm cái gì khác (ví dụ copy jar dưới tomcat và khởi động lại tomcat)

Và cả hai đều không liên quan .. vì vậy nếu trình biên dịch java không thành công, sẽ không có lý do gì để tệp jar cập nhật .. và nó khá ổn định.

Tôi đã sử dụng nó trên một dự án với 23K .java tệp và nó hoạt động trơn tru.

Mất quá trình xem một vài giây để bắt đầu - nhưng sau đó nó sẽ chỉ chạy nếu thay đổi được phát hiện để trải nghiệm tổng thể tốt đẹp.

Bước tiếp theo tôi dự định thêm tương tự với hỗ trợ SVN của bạn - liệt kê các tệp đã sửa đổi và sử dụng chúng làm khởi tạo.

Quan trọng cần lưu ý - nếu quá trình biên dịch không thành công, nó sẽ thử lại trong lần sửa đổi tiếp theo. vì vậy nếu bạn đang sửa đổi nhiều lọ, và trình biên dịch không thành công miễn là bạn đang viết mã, nó sẽ thử lại để biên dịch mọi thứ trên mỗi thay đổi mã cho đến khi nó được biên dịch thành công.

Nếu bạn muốn tôi có thể cố gắng tìm thấy dự án cũ của tôi, sửa chữa nó lên một chút và xuất bản nó ..

Các vấn đề liên quan