Có thể không?
Vâng chắc chắn. Tôi có trong cấu trúc quá khứ một vài dự án như thế này, ở đây một số bit tôi hy vọng sẽ giúp bạn bắt đầu.
Có hai tính năng chính của Maven mà bạn sẽ sử dụng để dệt mọi thứ lại với nhau:
Phân chia và chinh phục
Bạn sẽ cần phải chia các dự án của bạn trong nhiều dự án độc lập. Ở đây bởi độc lập tôi có nghĩa là tất cả các tham chiếu đến mã bên ngoài dự án được thực hiện thông qua các phụ thuộc trong Maven và không trực tiếp hợp nhất cây nguồn.
Tùy thuộc vào trạng thái của cây nguồn của bạn, điều này có thể đại diện cho rất nhiều công việc. Điều đó nói rằng bạn không làm điều đó để đánh giày với Maven mà là một phương tiện để cấu trúc và vệ sinh cơ sở mã của bạn. Hãy nghĩ về nó như là công cụ của bạn, dễ dàng hơn để tìm thấy những thứ ở đây:
hơn ở đây:
Maven phụ thuộc rất nhiều vào quy ước nên công cụ của bạn được tổ chức tốt hơn là Maven có thể giúp bạn nhiều hơn. Điều đó nói rằng, nó có thể yêu cầu bạn tổ chức lại để phù hợp hơn với quy ước của riêng nó và nếu tôi phải đưa ra một lời khuyên ở đây là việc thay đổi công cụ của bạn để phù hợp với quy ước của Maven hơn là thử và định cấu hình Maven thành hiểu quy ước của bạn.
Nếu các dự án này có thể sử dụng được bên ngoài ứng dụng chính, chúng có thể sống như các thư viện thực sự độc lập và bao gồm cả phụ thuộc maven. Họ nên sống trong kho lưu trữ của riêng họ (không phải trong cây nguồn ứng dụng) và không nên phụ thuộc vào bất kỳ phần nào của ứng dụng chính.
Các phần cốt lõi của ứng dụng của bạn, một khi được phân chia trong các dự án có thể được đặt cùng nhau dưới dạng các mô-đun. Thông thường, bạn sẽ đặt chúng làm thư mục con của thư mục nguồn chính của ứng dụng.
Ngoài ra POM cha của bạn cho ứng dụng của bạn sẽ chứa khai báo mô-đun. Bạn cũng sẽ đặt vào đó tất cả các phụ thuộc chung cho ứng dụng của mình cũng như khai báo hầu hết các plugin xây dựng và cấu hình của chúng. Ở đây tôi cũng khuyên bạn nên đặt một nhóm các thuộc tính cho những thứ như phiên bản của ứng dụng mà bạn có thể sử dụng lại trong các mô-đun. Quản lý dễ dàng hơn nhiều khi mọi thứ đều có cùng một phiên bản và có phiên bản ở một nơi làm cho điều này chỉ hoạt động.
Dụng cụ
Nếu bạn là một nhóm lớn hơn 1, tôi cũng rất khuyến khích bạn cài đặt một kho lưu trữ cho các phụ thuộc Maven của bạn. Nhìn vào Artifactory , Nexus hoặc Archiva . Bạn có thể định cấu hình tệp POM để cài đặt trực tiếp vào các tệp này để một khi chạy, nó sẽ không tốn nhiều chi phí nhưng sẽ tiết kiệm cho nhóm của bạn rất nhiều thời gian để giải quyết các phụ thuộc với bình đúng ở đúng vị trí.
Về chủ đề công cụ, bước hợp lý tiếp theo ở đây là một hệ thống tích hợp liên tục ( Jenkins , còn nhiều thứ nữa). Nó sẽ xử lý việc xây dựng nguồn chạy các bài kiểm tra và đẩy đến mức giả tạo, với tất cả điều này tại chỗ, tất cả những gì bạn phải làm là làm việc mã và phần còn lại chỉ hoạt động.
Vì bạn đang đóng gói ứng dụng của mình như một con ma chiến tranh có thể xử lý việc xây dựng chiến tranh và đặt tất cả các phụ thuộc vào vị trí thích hợp của chúng mà không phải hợp nhất các tệp jar hoặc công việc tương tự khác xung quanh, vì vậy không phải lo lắng ở đó.
Thí dụ
Tôi có thể tiếp tục lâu hơn ở đây nhưng không có gì là một ví dụ tốt. Nhìn vào github cho các dự án có độ lớn tương tự và xem cách chúng xây dựng các tệp pom và phân cấp thư mục của chúng. Nhìn vào nhiều hơn một, một số sẽ phù hợp với thiết lập của bạn hơn so với những người khác, không ai thực sự hóa thân vào sự thật nhưng bạn nên tìm đủ để thúc đẩy suy nghĩ của bạn về cách hoàn thành nó.
Lấy Jenkins làm ví dụ:
Bạn có thể thấy POM cha mẹ của họ khá rộng.
Họ sử dụng các mô-đun như bạn có thể thấy trong phần này:
<modules>
<module>core</module>
<module>war</module>
<module>test</module>
<module>cli</module>
</modules>
Và mỗi mô-đun tương ứng một thư mục con có cùng tên cũng chứa POM. Bạn có thể lồng nhiều như bạn muốn, mặc dù vậy hãy giữ nó trong mức độ tỉnh táo;).
Khởi đầu nhỏ
Nếu bạn chưa bao giờ sử dụng Maven, tôi sẽ đề nghị tuy nhiên bạn không bắt đầu với các mô-đun ngay lập tức. Hãy làm chậm, bắt đầu với, nói một trong những thư viện đơn giản hơn bạn có thể có và biến nó thành một dự án maven. Sau đó, làm cho ứng dụng chính của bạn là một dự án maven đơn giản. Khi công việc đó, bắt đầu thêm các phụ thuộc đơn giản, sau đó tách mô-đun đầu tiên của bạn và cứ thế.
Maven là một công cụ tuyệt vời nhưng nó cũng có thể là một siêu đau ở cổ đặc biệt là khi mọi thứ không theo cách của bạn. Bắt đầu với toàn bộ sự phiền toái trong lần đầu tiên của bạn là một người nhận thảm họa (là cho tôi!).
Nếu mọi thứ hơi kỳ lạ, bạn luôn có thể sử dụng mvn help:effective-pom
lệnh để xem Maven thực sự hiểu gì.
bổ sung
Từ nhận xét của bạn tôi hiểu rõ hơn những gì bạn muốn đạt được. Trong trường hợp này tôi sẽ đi tiếp cận plugin. Tạo một dự án hiển thị API của các điểm mở rộng mà bạn muốn cô lập công việc. Sau đó, bạn có thể sử dụng điều này như một sự phụ thuộc trong một dự án mới sẽ thực hiện nó. Trong ứng dụng chính của bạn, chỉ cần thêm các phụ thuộc thích hợp cho các triển khai này (không sử dụng các mô-đun maven lần này) và bạn sẽ thấy ổn. Cuối cùng, dự án ứng dụng chính sẽ mang gần như không có mã nguồn mọi thứ được thực hiện trong các dự án bên ngoài và được tải thông qua các phụ thuộc.
Bạn sẽ cần phải triển khai lại toàn bộ ứng dụng, tuy nhiên với cách tiếp cận này, bất kể lõi có thay đổi hay không vì chiến tranh được xây dựng tĩnh từ các phụ thuộc, thay đổi một trong số chúng ngụ ý xây dựng lại toàn bộ. Nghe có vẻ tệ nhất so với thực tế, thực tế chỉ có những thay đổi mới thực sự được xây dựng, phần còn lại về cơ bản sẽ là một bản sao của (các) bình trước đó. Nhưng vì mọi thứ đều nằm trong tệp tin chiến tranh nên nó sẽ cần phải được xây dựng lại, và máy chủ sẽ cần phải dừng lại và khởi động lại.
Nếu bạn cần phải đi xa hơn, mọi thứ sẽ phức tạp hơn một chút, mặc dù không phải là không thể. Tôi sẽ khuyên bạn nên xem xét OSGI, Apache Felix có thể giúp bạn bắt đầu, mặc dù cũng có những triển khai khác. Điều này sẽ cho phép bạn lấy bình bên ngoài và biến chúng thành các plugin thích hợp. Bạn sẽ có được nhiều quyền kiểm soát hơn trong vòng đời thời gian chạy của các thành phần mở ra cánh cửa để tải lại và cập nhật động. Tuy nhiên, nó sẽ yêu cầu những thay đổi lớn đối với cốt lõi của bạn một lần nữa, có lẽ không phải là điểm khởi đầu tốt. Tuy nhiên, một khi bạn có một dự án tách biệt và có tất cả các phần tách biệt theo cách bạn muốn, đó có thể là bước tiếp theo tự nhiên nếu bắt đầu và dừng ứng dụng khi cập nhật là một vấn đề lớn.
Sự khác biệt cơ bản giữa Mô-đun và phụ thuộc là:
- Các mô-đun sẽ sống trong cùng một cây nguồn với ứng dụng chính, là thư mục con lý tưởng.
- Phụ thuộc có thể là bất cứ nơi nào.
Bạn có thể tìm thấy kinh thánh ở đây .
Hy vọng điều này sẽ giúp, chúc may mắn.