2010-01-02 34 views
256

Có vẻ như có một số cách để cấu trúc poms mẹ trong một xây dựng đa và tôi tự hỏi nếu có ai có bất kỳ suy nghĩ về những lợi thế/nhược điểm là trong mỗi cách.Maven cha mẹ pom vs mô-đun pom

Phương pháp đơn giản nhất của việc có một pom mẹ sẽ đặt nó trong thư mục gốc của một dự án tức là

myproject/ 
    myproject-core/ 
    myproject-api/ 
    myproject-app/ 
    pom.xml 

nơi pom.xml được cả hai dự án cha mẹ cũng như mô tả -api -core và -app module

phương pháp tiếp theo là tách ra phụ huynh vào thư mục con riêng của mình như trong

myproject/ 
    mypoject-parent/ 
    pom.xml 
    myproject-core/ 
    myproject-api/ 
    myproject-app/ 

Trường hợp pom mẹ vẫn chứa các module nhưng họ là họ hàng, ví dụ: ../myproject-core

Cuối cùng, có tùy chọn nơi định nghĩa mô-đun và phụ huynh được tách ra như trong

myproject/ 
    mypoject-parent/ 
    pom.xml 
    myproject-core/ 
    myproject-api/ 
    myproject-app/ 
    pom.xml 

Trường hợp pom mẹ chứa bất kỳ "chia sẻ" cấu hình (dependencyManagement, tài sản, vv) và myproject/pom.xml chứa danh sách các mô-đun.

Mục đích là có thể mở rộng được với quy mô lớn, do đó, có thể mở rộng thành một số lượng lớn các dự án và hiện vật.

Một vài câu hỏi bonus:

  • đâu là nơi tốt nhất để xác định cấu hình chia sẻ khác nhau như trong kiểm soát nguồn, thư mục triển khai, bổ sung phổ biến vv (tôi giả phụ huynh nhưng tôi đã thường bị cắn bởi điều này và họ đã kết thúc trong mỗi dự án chứ không phải là một dự án chung).
  • Plugin maven phát hành, hudson và nexus đối phó với cách bạn thiết lập nhiều dự án của mình (có thể là một câu hỏi khổng lồ, nếu ai đó bị phát hiện khi xây dựng nhiều dự án thì sao?)?

Chỉnh sửa: Mỗi dự án phụ có pom.xml riêng của họ, tôi đã bỏ nó ra để giữ cho nó ngắn gọn.

+0

Mỗi mô-đun đều có pom của riêng mình không? Dự án của tôi có một pom cha mẹ, nhưng các mô-đun từng có một pom là tốt. (có lẽ là cách thứ tư cho những gì bạn mô tả) – harschware

+0

Ah, vâng, tôi sẽ chỉnh sửa và cập nhật. Mỗi submodules có pom riêng của họ là tốt. –

+3

Cũng giống như một bản cập nhật, tôi có thể thấy lợi thế của tùy chọn thứ hai là dễ quản lý hơn trong Eclipse nơi mà tệp pom.xml gốc trong ví dụ thứ nhất và thứ ba sẽ khó bao gồm nếu các mô đun con là các dự án riêng biệt trong Eclipse . –

Trả lời

153

Theo ý kiến ​​của tôi, để trả lời câu hỏi này, bạn cần suy nghĩ về vòng đời dự án và kiểm soát phiên bản. Nói cách khác, pom cha mẹ có chu kỳ sống riêng của nó tức là nó có thể được giải phóng riêng rẽ với các mô-đun khác hay không?

Nếu câu trả lời là (và đây là trường hợp của hầu hết các dự án đã được đề cập trong câu hỏi hoặc trong nhận xét), thì pom cha mẹ cần mô-đun của riêng mình từ VCS và từ quan điểm Maven và bạn sẽ kết thúc với một cái gì đó như thế này ở cấp VCS:

root 
|-- parent-pom 
| |-- branches 
| |-- tags 
| `-- trunk 
|  `-- pom.xml 
`-- projectA 
    |-- branches 
    |-- tags 
    `-- trunk 
     |-- module1 
     | `-- pom.xml 
     |-- moduleN 
     | `-- pom.xml 
     `-- pom.xml 

điều này làm cho các thanh toán một chút đau đớn và một cách phổ biến để đối phó với điều đó là sử dụng svn:externals. Ví dụ, thêm một thư mục trunks:

root 
|-- parent-pom 
| |-- branches 
| |-- tags 
| `-- trunk 
|  `-- pom.xml 
|-- projectA 
| |-- branches 
| |-- tags 
| `-- trunk 
|  |-- module1 
|  | `-- pom.xml 
|  |-- moduleN 
|  | `-- pom.xml 
|  `-- pom.xml 
`-- trunks 

Với định nghĩa externals sau:

parent-pom http://host/svn/parent-pom/trunk 
projectA http://host/svn/projectA/trunk 

Một thanh toán của trunks sau đó sẽ dẫn đến việc cấu trúc địa phương sau (mẫu 2 #):

root/ 
    parent-pom/ 
    pom.xml 
    projectA/ 

Tùy chọn, bạn thậm chí có thể thêm pom.xml trong thư mục trunks:

root 
|-- parent-pom 
| |-- branches 
| |-- tags 
| `-- trunk 
|  `-- pom.xml 
|-- projectA 
| |-- branches 
| |-- tags 
| `-- trunk 
|  |-- module1 
|  | `-- pom.xml 
|  |-- moduleN 
|  | `-- pom.xml 
|  `-- pom.xml 
`-- trunks 
    `-- pom.xml 

pom.xml là loại pom "giả": nó không bao giờ được phát hành, nó không chứa phiên bản thực vì tệp này không bao giờ được phát hành, nó chỉ chứa danh sách các mô-đun. Với tập tin này, một kiểm tra sẽ cho kết quả trong cấu trúc này (mô hình # 3):

root/ 
    parent-pom/ 
    pom.xml 
    projectA/ 
    pom.xml 

này "hack" cho phép để khởi động một lò phản ứng xây dựng từ gốc sau một kiểm tra và thực hiện những điều có ích hơn. Trên thực tế, đây là cách tôi muốn thiết lập các dự án maven và một kho lưu trữ VCS cho các bản dựng lớn: nó hoạt động, nó cân tốt, nó mang lại tất cả sự linh hoạt mà bạn có thể cần.

Nếu câu trả lời là không (quay lại câu hỏi ban đầu), thì tôi nghĩ bạn có thể sống với mẫu # 1 (làm điều đơn giản nhất có thể hoạt động).

Bây giờ, về các câu hỏi bonus:

  • đâu là nơi tốt nhất để xác định cấu hình chia sẻ khác nhau như trong kiểm soát nguồn, thư mục triển khai, bổ sung phổ biến vv (tôi giả phụ huynh nhưng Tôi thường bị cắn bởi điều này và họ đã kết thúc trong mỗi dự án chứ không phải là một dự án chung).

Thành thực mà nói, tôi không biết làm thế nào để không đưa ra một câu trả lời chung ở đây (như "sử dụng mức mà bạn nghĩ rằng nó làm cho tinh thần để mutualize điều"). Và dù sao, poms trẻ em luôn có thể ghi đè lên các cài đặt kế thừa.

  • Làm thế nào để các plugin maven-phát hành, hudson và thỏa thuận mối quan hệ với cách bạn thiết lập nhiều dự án của bạn (có thể là một câu hỏi khổng lồ, nó còn hơn nếu có ai đã bị bắt ra khi bao một dự án đa xây dựng đã được thiết lập)?

Thiết lập tôi sử dụng hoạt động tốt, không có gì đề cập cụ thể.

Thực ra, tôi tự hỏi làm thế nào mà maven-release-plugin giao dịch với mẫu # 1 (đặc biệt là với phần <parent> vì bạn không thể có phụ thuộc SNAPSHOT vào thời điểm phát hành). Điều này nghe có vẻ giống như một vấn đề gà hoặc trứng nhưng tôi không thể nhớ nếu nó hoạt động và đã quá lười biếng để kiểm tra nó.

+0

+1 Tương tự tại đây. Ý tưởng hay với svn: externals! – mhaller

+0

Điều đó rất tốt vì tôi có thể thấy nó cân bằng như thế nào. Các svn: externals trả lời mối quan tâm của tôi về nó là cồng kềnh. –

+0

@jamie Rất vui khi bạn thấy nó hữu ích. –

21
  1. Cha mẹ độc lập là cách tốt nhất để chia sẻ cấu hình và tùy chọn trên các thành phần không được tách rời. Apache có một dự án cha mẹ để chia sẻ thông báo pháp lý và một số tùy chọn bao bì phổ biến.

  2. Nếu dự án cấp cao nhất của bạn có công việc thực sự, chẳng hạn như tổng hợp javadoc hoặc đóng gói bản phát hành, bạn sẽ có xung đột giữa các cài đặt cần thiết để thực hiện công việc đó và cài đặt bạn muốn chia sẻ qua cha mẹ. Dự án chỉ dành cho cha mẹ tránh điều đó.

  3. Một mẫu chung (bỏ qua # 1 cho thời điểm này) là các dự án có mã sử dụng một dự án mẹ làm cha mẹ của chúng và để nó sử dụng cấp cao nhất làm cha mẹ. Điều này cho phép tất cả những thứ cốt lõi được chia sẻ, nhưng tránh được vấn đề được mô tả trong # 2.

  4. Plugin trang web sẽ rất bối rối nếu cấu trúc gốc không giống cấu trúc thư mục. Nếu bạn muốn xây dựng một trang web tổng hợp, bạn sẽ cần phải làm một số không quan trọng để có được xung quanh này.

  5. Apache CXF là ví dụ về mẫu trong # 2.

+2

Tôi đã có một cái nhìn tại ibilio và rất nhiều dự án xuất hiện để thích pom "độc lập" cha mẹ. Hibernate, ActiveMQ, Jetty, XStream, vv… Đó là cơ chế defacto. –

+2

Một nhược điểm khác của phụ huynh độc lập dường như là plugin phát hành maven dường như muốn cha mẹ được ghim vào phiên bản trước khi nó sẽ phát hành. Có lẽ không có nhiều vấn đề vì cha mẹ không nên thay đổi quá nhiều. –

31

Từ kinh nghiệm của tôi và thực hành tốt nhất Maven có hai loại "poms cha mẹ"

  • "công ty" mẹ pom - pom này chứa công ty cụ thể thông tin và cấu hình của bạn mà kế thừa mỗi pom và không cần phải sao chép. Những thông tin này bao gồm:

    • kho
    • phần managment
    • phân phối
    • plugins cấu hình thông thường (như maven-biên dịch-plugin mã nguồn và các phiên bản mục tiêu)
    • tổ chức, phát triển, vv

    Chuẩn bị pom cha mẹ này cần phải được thực hiện một cách thận trọng, bởi vì tất cả các poms công ty của bạn sẽ kế thừa từ nó, vì vậy pom này phải được trưởng thành và ổn định (phát hành một phiên bản của cha mẹ pom không nên ảnh hưởng đến để phát hành tất cả các dự án của công ty bạn!)

  • loại thứ hai của cha mẹ là một phụ huynh đa mô-đun. Tôi thích giải pháp đầu tiên của bạn - đây là một quy ước maven mặc định cho các dự án đa mô-đun, rất thường xuyên đại diện cho cấu trúc mã VCS

Mục đích là để có thể mở rộng để một xây dựng quy mô lớn như vậy nên khả năng mở rộng đến một số lượng lớn các dự án và hiện vật.

Mutliprojects có cấu trúc cây - vì vậy bạn không bị xếp vào một cấp độ gốc của cha mẹ. Cố gắng tìm một Cơ cấu dự án phù hợp cho nhu cầu của bạn - một exmample cổ điển là làm thế nào để disrtibute dự án mutimodule

distibution/ 
documentation/ 
myproject/ 
    myproject-core/ 
    myproject-api/ 
    myproject-app/ 
    pom.xml 
pom.xml 

Một vài câu hỏi bonus:

  • đâu là nơi tốt nhất để xác định được chia sẻ khác nhau cấu hình như trong kiểm soát nguồn, thư mục triển khai, plugin phổ biến, vv (Tôi giả sử cha mẹ nhưng tôi thường bị cắn bởi điều này và họ đã kết thúc trong mỗi dự án chứ không phải là một chung).

Cấu hình này phải được chia thành một cách khôn ngoan thành một "cha mẹ" và cha mẹ của dự án. Những điều liên quan đến tất cả các bạn dự án đi đến "công ty" cha mẹ và điều này liên quan đến dự án hiện tại đi đến dự án của một người.

  • Làm thế nào để các plugin maven-phát hành, hudson và thỏa thuận mối quan hệ với cách bạn thiết lập nhiều dự án của bạn (có thể là một câu hỏi khổng lồ, nó còn hơn nếu có ai đã bị bắt ra khi bao một dự án đa xây dựng đã được thiết lập)?

Công ty mẹ phải được phát hành trước. Đối với các quy tắc chuẩn đa cấp, áp dụng. Máy chủ CI cần phải biết tất cả để xây dựng dự án một cách chính xác.

+0

Vì vậy, có hai loại dự án mẹ/poms. Một bản không có tuyên bố . Đây là cái được sử dụng cho Thừa kế. Và một dự án phụ huynh với tuyên bố . Đây là một mô-đun con không kế thừa, nó chỉ là để quản lý việc xây dựng dự án giữ. Tôi có đúng không? – lisak

8

Có một chút bắt với phương pháp thứ ba. Vì các POM tổng hợp (myproject/pom.xml) thường không có cha mẹ, chúng không chia sẻ cấu hình. Điều đó có nghĩa là tất cả những POM tổng hợp sẽ chỉ có các kho lưu trữ mặc định.

Đó không phải là vấn đề nếu bạn chỉ sử dụng plugin từ miền Trung, tuy nhiên, điều này sẽ thất bại nếu bạn chạy plugin bằng cách sử dụng plugin: định dạng mục tiêu từ kho lưu trữ nội bộ của bạn. Ví dụ: bạn có thể có foo-maven-plugin với nhómId của org.example cung cấp mục tiêu generate-foo. Nếu bạn cố gắng chạy nó từ gốc của dự án bằng cách sử dụng lệnh như mvn org.example:foo-maven-plugin:generate-foo, nó sẽ không chạy trên các mô-đun tổng hợp (xem compatibility note).

Một số giải pháp có thể xảy ra:

  1. Triển khai plugin để các Maven Trung ương (không phải lúc nào có thể).
  2. Chỉ định phần lưu trữ trong tất cả các POM tổng hợp của bạn (nguyên tắc DRY vi phạm).
  3. Có kho lưu trữ nội bộ này được định cấu hình trong tệp settings.xml (trong cài đặt cục bộ tại ~/.m2/settings.xml hoặc trong cài đặt chung tại /conf/settings.xml). Sẽ làm cho xây dựng thất bại mà không có những tập tin settings.xml (có thể được chấp nhận cho các dự án lớn trong nhà mà không bao giờ được xây dựng bên ngoài công ty).
  4. Sử dụng phụ huynh có cài đặt kho lưu trữ trong POM tổng hợp của bạn (có thể là quá nhiều POM cha mẹ?).
Các vấn đề liên quan