2009-10-28 39 views
40

Chúng tôi có các dự án java và flex tại nơi làm việc. Chúng tôi hiện có 1 pom cơ sở chứa các cấu hình chúng tôi muốn sử dụng cho cả hai dự án. Vấn đề với điều này là: các dự án flex kế thừa cấu hình cho javadoc và pmd chẳng hạn, mà chúng không muốn.Dự án maven có thể có nhiều cha mẹ?

Tôi muốn làm điều này một chút sạch sẽ hơn và có một cơ sở thực sự-pom và sau đó một java-base-pom và một flex-base-pom. Nhưng làm thế nào điều này làm việc trong một multimodule có cả một phần flex và một phần java?

Chúng tôi có plugin để ứng dụng riêng của chúng tôi, nơi chúng ta sử dụng cấu trúc sau:

  • my-Plugin
    • my-Plugin-client (flex)
    • my-Plugin-server (java)

Plugin của tôi chỉ chứa một tệp pom.xml. Tôi sẽ sử dụng tệp pom.xml của plugin của tôi làm cha mẹ cho cả hai, nhưng sau đó tôi cũng không thể sử dụng cơ sở java-pom hoặc cơ sở flex-pom cũng như cha mẹ. Điều gì sẽ là approarch tốt nhất cho điều này?

Trả lời

27

Một dự án có thể chỉ có một mẹ (không giống như đa kế thừa trong C++) nhưng phụ huynh này có thể là một phần của một hệ thống cấp bậc cha mẹ lớn hơn. Như đã chỉ ra bởi những người khác, bạn do đó có thể có một cái gì đó như thế này:

 
base-pom/ 
|-- flex-base-pom 
| |-- my-plugin-client 
| | `-- pom.xml 
| `-- pom.xml 
|-- java-base-pom 
| |-- my-plugin-server 
| | `-- pom.xml 
| `-- pom.xml 
`-- pom.xml 

Điều đó nói rằng, tôi nhận thấy bạn đã viết rằng vấn đề thực tế của bạn là:

dự án flex kế thừa cấu hình cho javadoc và PMD cho ví dụ, mà họ không muốn.

Bạn nên sử dụng các yếu tố pluginManagement để tránh tình trạng này:

pluginManagement là một yếu tố được xem cùng plugins bên. Quản lý Plugin chứa các yếu tố plugin trong cách tương tự, ngoại trừ việc chứ không phải là cấu hình cắm thông tin cho dự án xây dựng đặc biệt này, nó được thiết kế để cấu hình dự án xây dựng mà kế thừa từ thế này. Tuy nhiên, điều này chỉ cấu hình các plugin thực sự được tham chiếu trong phần tử plugins ở trẻ em. Các trẻ em có mọi quyền ghi đè các định nghĩa pluginManagement.

Vì vậy, trong pom phụ huynh, cấu hình các plugin của mình trong pluginManagement (javadoc và PMD ví dụ), và tham khảo chúng trong các yếu tố plugins trong những đứa trẻ mong muốn (chỉ trong my-Plugin-server ở đây). Điều này sẽ giải quyết vấn đề hiện tại của bạn.

+0

Cảm ơn câu trả lời, nhưng như tôi đã nói trong một nhận xét cho câu trả lời khác, đây không phải là một cấu trúc tôi có thể sử dụng. Nếu không có gì khác bật lên, thì pluginManagement có thể là cách duy nhất để làm điều đó. Nhược điểm là sau đó tôi không thể thực thi PMD trên tất cả các dự án java, vì nó chỉ là trong pluginManagement và bản thân dự án phải thêm nó vào phần plugin của riêng mình. –

+0

Chấp nhận điều này làm câu trả lời. Với trạng thái hiện tại của Maven, việc sử dụng pluginManagement sẽ là giải pháp tốt nhất. –

2

Chỉ cần hình ảnh pom.xml thực tế là các lớp Java: bạn chỉ có thể có một phụ huynh (hoặc mở rộng một lớp), nhưng cha mẹ này cũng có thể có một phụ huynh khác, v.v.

Như tôi đã giải thích here, bạn phải phân biệt nguyên tắc gốc và tập hợp trong Maven, có nghĩa là plugin của tôi sẽ được coi là dự án tổng hợp, không nhất thiết là dự án cha mẹ cho cả plugin-ứng dụng khách và plugin của tôi -cha mẹ.

Vì vậy, để tóm tắt:

my-plugin sẽ xác định pom cơ sở cho tất cả các dự án của bạn. Sau đó, bạn tạo hai dự án pom mới: java-base-pomflex-base-pom. Họ có cả hai my-plugin làm cha mẹ. Bây giờ, my-plugin-client sẽ có java-base-pom làm cha mẹ, trong khi plugin-máy chủ của tôi sẽ sử dụng flex-base-pom cho cha mẹ của mình.

Bằng cách này, trình cắm-ứng dụng khách của tôi sẽ kế thừa tất cả các thuộc tính được xác định trong tệp p2.xml my-plugin và cũng từ dự án java-base-pom.

+0

Có lẽ tôi đã không làm cho bản thân mình đủ rõ ràng. Các poms cơ bản phải ở gốc của hệ thống phân cấp vì bản thân ứng dụng cũng phụ thuộc vào nó, hoặc bất kỳ mô-đun java nào khác mà chúng ta xây dựng. Nó chỉ là bên cạnh đó tôi cũng có cấu trúc plugin này mà sẽ cần loại 2 cha mẹ, nhưng điều này là không thể có vẻ như nó. –

6

Cách duy nhất là có base-pom làm cha mẹ của java-base-pom và flex-base-pom.

Tôi có cấu trúc tương tự cho các dự án mùa xuân của tôi:

base-pom (basic configuration - eclipse, reports, repositories, etc) 
| 
+ spring-base-pom (spring definitions) 
    | 
    + spring-jar-base-pom (jar specific definitions) 
    | 
    + spring-war-base-pom (spring web and servlet dependencies) 
    | 
    + spring-webapp-base_pom (spring web mvc dependencies) 
+0

Đồng ý. Làm thế nào nhiều cha mẹ sẽ làm việc anyway - điều gì sẽ xảy ra nếu cả hai cha mẹ có tài sản xung đột? –

+0

Đứa trẻ ghi đè phụ huynh, vì vậy các cài đặt trong java-base-pom sẽ ghi đè lên các cơ sở của java-base-pom, v.v. Theo cách này, java-base-pom và flex-base-pom không liên quan. –

+0

Tôi gặp khó khăn khi thực hiện nhiều cấp độ phân cấp - ở cấp độ thứ ba của tôi (tương tự như spring-webapp-base_pom) phần pluginManagement từ cha mẹ bị bỏ qua hoàn toàn. có ai biết tại sao việc này lại xảy ra? – Neikius

3

Tôi đã vượt qua proble này chính xác cũng có, và là giải pháp tốt nhất mà tôi tìm thấy là sử dụng thừa kế và Aggregation như gợi ý trong câu hỏi này: does maven support multiple parents (multiple inheritance) ?

Bạn có thể có một pom aggregator đó không phải là mẹ của các dự án đó là tổng hợp.

và giải trình trong Maven Documentation

thừa kế và kết hợp tạo ra một động lực tốt đẹp để kiểm soát được xây dựng thông qua một duy nhất, cao cấp POM (...) Ngược lại, một dự án POM có thể tổng hợp các dự án làm không kế thừa từ nó.

Từ này tôi đã có POMs thừa kế của tôi (pom-master chứa xã cấu hình, và mỗi trẻ em các chi tiết cụ thể những người thân):

 
pom-master 
    |-- pom-java 
    |-- pom-flex 

và vì vậy dự án của tôi có thể nhận được các chi tiết cụ thể cho từng module cấu hình như mong muốn :

 
project (aggregate project-flex & project-java) 
    |-- project-java 
    |  `-- pom.xml => parent = pom-java 
    |-- project-flex 
    |  `-- pom.xml ==> parent = pom-flex 
    `-- pom.xml => parent = pom-master 

Hy vọng nó sẽ giúp những người khác cũng :)

+0

Xin chào, bạn sẽ thiết lập plugin maven-site-plugin và maven-release-plugin bằng cấu trúc này như thế nào? – Cristiano

1

Bạn có thể đạt được nhiều inhe ritance với hồ sơ:

Bạn tạo (nhiều) cấu hình trong pom root, và tự động kích hoạt bất kỳ biến thể của các cấu hình đạt được kế thừa của nhiều cấu hình maven.

+0

Điều này không lý tưởng vì các dự án con không thể kiểm soát việc kích hoạt các cấu hình được xác định trong POM mẹ. – GuyPaddock

7

Mặc dù dự án maven có người mẹ độc thân, họ có thể nhập bất kỳ số lượng khác pom của như thế này:

<dependencyManagement> 
    <dependency> 
     <groupId>org.example</groupId> 
     <artifactId>my-shared-dependencies</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
<dependencyManagement> 

này có hai sự khác biệt quan trọng so với cha mẹ:

  1. Plugins định nghĩa trong pom được nhập sẽ không được nhập
  2. Các phụ thuộc được xác định trong pom đã nhập sẽ không được thêm vào pom hiện tại, nó sẽ chỉ nhập phụ thuộc vào phần quản lý phụ thuộc

Tuy nhiên nếu pom cha mẹ của bạn có một < phụ thuộc> và bạn muốn bao gồm những thành phụ thuộc của bạn thì bạn có thể thêm phụ huynh đến phần phụ thuộc giống như một sự phụ thuộc thường xuyên:

<dependency> 
    <groupId>org.example</groupId> 
    <artifactId>my-shared-dependencies</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</dependency> 

Mặc dù cùng một phụ thuộc đã được nhập, thẻ phiên bản phải được chỉ định lại. Để giảm trùng lặp, nó có thể được lưu trữ trong một thuộc tính

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