2017-11-16 17 views
12

Chúng tôi là một công ty lớn với khoảng 2000 dự án Java riêng biệt. Vì lý do lịch sử, chúng tôi không có dự án nhiều mô-đun, nhưng chúng tôi muốn giới thiệu chúng.Xuất bản một bom từ một dự án đa mô-đun

Về mặt logic, chúng tôi đã có "nhóm" dự án, nghĩa là ai đó chịu trách nhiệm về (nói) 50 dự án liên quan chặt chẽ. Người này thường xuyên xuất bản một BOM có chứa các phiên bản gần đây, mạch lạc của 50 dự án này.

Bây giờ, sẽ có nhiều ý nghĩa để lấy 50 dự án này và đưa chúng vào một dự án nhiều mô-đun lớn. Tuy nhiên, nó sẽ là cần thiết để xuất bản một BOM vì các dự án khác (bên ngoài nhóm của chúng tôi) cần phải có các phiên bản mạch lạc.

Vì vậy, tóm tắt, chúng tôi cần một BOM có chứa các phiên bản của tất cả 50 dự án là một phần của dự án đa mô-đun. Tôi tự hỏi điều gì sẽ là "cách Maven" để tạo ra một BOM như vậy. Những gì tôi có thể nghĩ đến:

  • Bom là dự án thứ 51 của dự án đa mô-đun. Các phiên bản của các phụ thuộc được thiết lập bởi các thuộc tính trong pom cha.
  • Bom được tạo ra từ thông tin có trong dự án đa mô-đun và được xuất bản dưới dạng tạo tác phụ (điều này có thể yêu cầu chúng tôi viết một plugin Maven cho việc này).

Điều gì sẽ được khuyến khích?

+0

Bằng các dự án bạn ngụ ý bất cứ điều gì - một ứng dụng độc lập hoặc một lib? Và bạn tham khảo những libs (nhưng không phải ứng dụng) trong các dự án khác (cả ứng dụng và libs)? Và bạn muốn nhóm nhiều libs thành 1 dự án và xuất bản chúng thành một thực thể (BOM)? –

+1

Không rõ chính xác bạn muốn đạt được từ những gì bạn có. –

+0

@ ThorbjørnRavnAndersen Tôi muốn làm rõ, nhưng bạn có thể cho tôi biết phần nào không rõ ràng với bạn? –

Trả lời

4

Chúng tôi đang sử dụng BOM cũng như cho các dự án đa mô-đun của chúng tôi, nhưng chúng tôi không gắn kết thế hệ của họ hoặc cập nhật để xây dựng các mô-đun đó.

Một BOM chỉ được cập nhật khi quy trình quản lý phát hành hoàn thành việc phân phối mô-đun đã xây dựng (hoặc nhóm mô-đun): sau khi được phân phối, BOM được cập nhật và đẩy lên Nexus (được lưu trữ dưới dạng phiên bản 1.0-SNAPSHOT) ghi đè sau mỗi lần giao hàng)

các BOM sau đó được bao gồm trong POM của chúng tôi (đối với dự án mono hoặc nhiều mô-đun) và sử dụng chỉ quản lý phụ thuộc, có nghĩa là các dự án của chúng tôi phụ thuộc vào vật mà không phiên bản: quản lý sự phụ thuộc từ BOM cung cấp phiên bản phân phối mới nhất của các mô đun phụ thuộc khác.

Nói cách khác, chúng tôi tách biệt khía cạnh xây dựng (thực hiện ở đây với maven) từ phần phát hành: "hóa đơn nguyên liệu" đại diện cho những gì đã được phân phối và đảm bảo tất cả các dự án đang xây dựng với các phiên bản được coi là hoạt động tốt với nhau (chúng đã được đưa vào sản xuất cùng nhau).

+0

Cảm ơn bạn đã trả lời sâu sắc này. Đó là một ý tưởng tốt để trì hoãn việc tạo BOM sau giai đoạn thử nghiệm (và khả năng phân phối). Nhưng tôi sẽ cẩn thận với việc bạn "lạm dụng" SNAPSHOT vì việc trao đổi các phiên bản theo cách này có thể gây ra sự bất ổn xây dựng (trừ khi, tất nhiên, điều này được thông báo rõ ràng và hiếm khi xảy ra). –

+0

@JFMeier Chính xác: đó là lý do tại sao tôi đã phát triển một máy ghi âm: theo mặc định, bản dựng * không * sử dụng BOM, nhưng phần quản lý phụ thuộc đặc biệt trong đó các phiên bản được thiết lập. Theo yêu cầu, plugin được ghi sẽ đọc BOM và thay thế phần đặc biệt đó bằng phiên bản BOM. Vì tệp pom.xml nằm trong repo Git, bạn có thể thực hiện theo các thay đổi của phiên bản được ghi lại sau mỗi cuộc gọi đến plugin đó. Nhưng theo mặc định, không có plugin nào được gọi và "phần quản lý phụ thuộc đặc biệt" được sử dụng lại, với một bộ phiên bản cố định, đảm bảo tính ổn định của nền tảng xây dựng. – VonC

+0

@JFMeier Mục tiêu là để trả lời câu hỏi: tôi nên xây dựng dự án của mình bằng phiên bản nào?Theo yêu cầu, bạn có thể nhận các phiên bản đó là "phiên bản hiện đang được triển khai" (đọc BOM, sửa đổi cho bạn tệp pom.xml). Nhưng đối với tất cả các trường hợp xây dựng khác, bạn chỉ sử dụng những gì đã được thiết lập trước đó (một lần nữa: xây dựng sự ổn định) – VonC

4

Tôi chưa từng thấy 2K các dự án Java thương mại, như vậy sẽ căn cứ câu trả lời của tôi về cách mã nguồn mở hoạt động:

  • Thư viện không nên được nhóm lại theo người - họ nên được nhóm lại theo những vấn đề họ giải quyết. Các dự án mã nguồn mở thường có nhiều libs, ví dụ: Jackson có jackson-databind, jackson-datatype-jsr310, vv Các libs này liên quan chặt chẽ với nhau và có thể phụ thuộc lẫn nhau.
  • Các nhóm như vậy không nên quá lớn. Một số dự án có thể có 1, những dự án khác - 5 hoặc 10. 50 libs trong một nhóm có vẻ quá nhiều.
  • Sẽ dễ dàng hơn nếu libs trong một nhóm được giải phóng tất cả cùng một lúc (ngay cả khi chỉ có một cập nhật). Điều này giúp bạn dễ dàng theo dõi các phiên bản trong các ứng dụng sử dụng nhiều lib từ một nhóm.
  • Nên có không phụ thuộc giữa các nhóm! Và đây có lẽ là quy tắc quan trọng nhất. Phân cấp sâu của các thư viện phụ thuộc vào nhau là không thể chấp nhận được vì bây giờ bạn cần phải giữ sự tương thích giữa nhiều dự án và libs. Điều này chỉ không quy mô. Điều đó có nghĩa là thỉnh thoảng sẽ có mã sao chép-dán giữa các lib - đây là cái ác nhỏ hơn.
  • Có thể có một số ngoại lệ đối với quy tắc cuối cùng (có thể là một lib được sử dụng ở mọi nơi) nhưng phải giữ lại tính tương thích ngược của API công khai cho đến khi không có dự án nào phụ thuộc vào API cũ. Các thư viện này rất khó duy trì và tốt hơn nên mở chúng ra.

Dự án độc lập bây giờ có thể phụ thuộc vào thư viện từ cùng một nhóm hoặc khác nhau, nhưng vì phiên bản trong nhóm giống nhau, thật dễ dàng để đặt nó làm thuộc tính chỉ một lần.Hoặc:

  • Bạn có thể nhìn vào <scope>import</scope> mà cho phép nhập khẩu <dependencyManagement> phần từ các tập tin POM khác như POMs cha mẹ trong một nhóm (đối với một số lý do không bao giờ làm việc cho tôi).
  • Hoặc tại tất cả các mô-đun xxx - một mô-đun phụ thuộc vào tất cả các mô-đun khác trong nhóm và do đó khi bạn phụ thuộc vào nó, bạn cũng phụ thuộc vào người khác quá mức.
+0

Cảm ơn bạn đã trả lời. Nhưng sự thật là: Công ty chúng tôi có 2000 dự án Java (mỗi người trong số họ tạo ra một cái lọ, chiến tranh hoặc tai), hầu hết trong số đó là loại thư viện (một số là tai hoặc chiến tranh sử dụng thư viện), và chúng đã phụ thuộc lẫn nhau. Những phụ thuộc này nằm trong "các nhóm" (dựa trên các chủ đề thực sự, nhưng có một người chịu trách nhiệm), nhưng chúng cũng đi giữa các nhóm theo nhiều cách khác nhau. –

+0

Chúng tôi không thể tháo nút thắt lớn này - chúng tôi chỉ có thể quản lý nó. Đây là lý do tại sao chúng tôi muốn đưa các dự án của một nhóm vào một dự án đa mô-đun. Tuy nhiên, các dự án đa mô-đun khác nhau sẽ có các phụ thuộc khác nhau giữa nhau. –

+0

phụ thuộc giữa các nhóm có cấu trúc cây khác với bất kỳ chu kỳ nào là ok – caot

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