Cảnh báo về việc sử dụng project.parent.version làm phiên bản của mô-đun trong Maven 3


79

Trong các dự án đa mô-đun maven mà tôi muốn mỗi mô-đun luôn giữ cùng một phiên bản với phiên bản gốc, tôi thường thực hiện một số việc như sau trong pom.xml của mô-đun:

  <parent>
    <groupId>com.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <groupId>com.groupId</groupId>
  <artifactId>artifactId</artifactId>
  <packaging>jar</packaging>
  <version>${project.parent.version}</version>
  <name>name</name>

Vì tôi bắt đầu sử dụng maven 3.0-alpha-5, tôi nhận được cảnh báo sau khi làm như vậy.

[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.groupid.artifactId:name:jar:1.1-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.groupid.artifactId:name::${project.parent.version}, /Users/whaley/path/to/project/child/pom.xml
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

Tôi tò mò muốn biết vấn đề thực sự khi gắn phiên bản của mô-đun với phiên bản mẹ là gì, nếu có? Hay đây là một trường hợp cảnh báo chung khi bất kỳ biểu thức nào, bất kể đó là project.parent.version, được sử dụng cho phần tử phiên bản.

Câu trả lời:


91

Tôi tò mò muốn biết vấn đề thực sự khi gắn phiên bản của mô-đun với phiên bản mẹ là gì, nếu có? Hay đây là một trường hợp cảnh báo chung khi bất kỳ biểu thức nào, bất kể đó là project.parent.version, được sử dụng cho phần tử phiên bản.

Chà, điều đó sẽ dễ dàng kiểm tra. Bởi vì tôi tò mò, tôi chỉ làm điều đó cho bạn bằng cách sử dụng pom sau:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>com.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.mycompany</groupId>
  <artifactId>module</artifactId>
  <version>${myversion}</version>
  <name>module</name>
  <url>http://maven.apache.org</url>
  <properties>
    <myversion>1.0-SNAPSHOT</myversion>
  </properties>
  ...
</project>

Và maven thực sự đang phàn nàn:

[WARNING] 'version' contains an expression but should be a constant. @ com.mycompany:module:${myversion}, /home/pascal/Projects/maven-maven3-testcase/module/pom.xml

Thành thật mà nói, tôi nghĩ rằng maven đúng ở đây, không có ý nghĩa gì khi sử dụng một thuộc tính cho <version>phần tử (ít nhất là không phải cho project.version) và thật tuyệt khi maven phàn nàn về nó.

Và nếu bạn muốn sử dụng phiên bản pom mẹ trong các mô-đun con, chỉ cần xóa <version>thẻ khỏi các pom con , chúng sẽ kế thừa phiên bản từ mẹ. Những gì bạn đang làm hiện tại là không cần thiết.


2
Chỉ cần nhìn thấy câu trả lời được in đậm của bạn được ghi lại tại đây: maven.apache.org/guides/introduction/… . Nó đã được đề cập theo cách đó trong Maven: The Definitive hướng dẫn, nhưng tôi đã phủ nhận điều đó vào thời điểm tôi đọc nó. Cảm ơn vì sự đúng đắn của bạn.
whaley

13
Các ví dụ trong jira.codehaus.org/browse/MNG-4715 dường như có một số lý do hợp lệ cho việc sử dụng một thuộc tính cho phần tử <version>, vì vậy tôi không tin là không sử dụng thuộc tính đó, nhưng +1 để nhắc chúng tôi rằng trong trường hợp bạn muốn các mô-đun con sử dụng phiên bản pom mẹ, chỉ cần xóa thẻ và để tính năng kế thừa hoạt động.
metamatt

7
Thật ngu ngốc :-(. Tôi làm cách nào để sử dụng $ {buildNumber} từ buildnumber-maven-plugin trong phiên bản?
Nux

6
Không! Trong Maven phiên bản 3.2.1 loại bỏ các phiên bản thẻ từ poms đứa trẻ, dẫn đến 'dự án xây dựng lỗi: parent.version là mất tích'
Junchen Liu

5
@shanyangqu. Chỉ cần được rõ ràng ở đây. Bạn đúng khi nói rằng bạn không thể xóa phiên bản khỏi phần mẹ của pom con. Điều đó cần thiết để chỉ định nguồn gốc mà bạn đang thừa kế. Nhưng bạn có thể bỏ qua phiên bản của chính đứa trẻ. Nó sẽ mặc định là parent.version (phiên bản trong phần gốc).
drrob

1

Tôi có thể đến muộn để thảo luận về điều này. Tôi có một giải pháp đơn giản cho việc này WARNING.

Trước hết, nếu bạn muốn tất cả các mô-đun con sẽ có cùng phiên bản như cha mẹ, thì bạn chỉ cần xóa <version>thẻ khỏi POM con và khi bạn đưa <parent>vào POM con, điều đó sẽ có ở đó.

Trong trường hợp không có <version>POM con, nó sẽ tự động lấy POM gốc version.

Bây giờ nếu bạn muốn sử dụng propertytrong phiên bản POM mẹ và muốn nhận được điều tương tự trong tất cả các mô-đun con, bạn có thể thực hiện như sau.

Không có giới hạn về việc sử dụng tài sản <version>của một phần POM cha mẹ hoặc con cái. Nhưng nếu bạn sử dụng thẻ xml của riêng mình để chỉ định điều đó hoặc bạn sử dụng thuộc tính của riêng mình, thì sẽ WARNINGxảy ra, (mặc dù đây chỉ là cảnh báo, mọi thứ hoạt động như mong đợi).

Nhưng nếu bạn muốn loại bỏ điều này WARNING, bạn có thể làm theo các bước sau:

  1. Tạo <properties>bên trong POM.xml như bên dưới

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. Trong <version>POM.xml, đặt như sau

    <version>${revision}</version>
    

Đoạn mã mẫu (cho dự án nhiều mô-đun):

<groupId>abc.xyz</groupId>
<artifactId>pqr</artifactId>
<!-- <version>1.0.0</version> -->
<version>${revision}</version>
<packaging>pom</packaging>
<description>Parent POM</description>

<properties>
    <revision>1.0.0</revision>
</properties>

Lưu ý : Thay vì <revision>, nếu bạn sử dụng bất kỳ tên nào khác (ví dụ <my.version>:), bạn sẽ phải đối mặt vớiWARNING

Bây giờ nếu bạn muốn vượt qua phiên bản trong thời gian mvn deploy, bạn có thể sử dụng mvn deploy "-Drevision=1.0.0-SNAPSHOT"và tương tự như vậy mvn install.

Bây giờ nếu cấu hình trên, bạn muốn sử dụng làm POM gốc và bạn muốn sử dụng giống nhau versiontrong tất cả mô-đun con, điều đó cũng có thể được thực hiện. Trong mỗi child module POM, sử dụng bên dưới

<parent>
    <groupId>abc.xyz</groupId>
    <artifactId>Parent</artifactId>
    <!-- <version>1.0.0</version> -->
    <version>${revision}</version>
</parent>

<groupId>abc.xyz</groupId>
<artifactId>Child</artifactId>
<!-- <version>1.0.0</version> -->     <!-- Automatically inherit parent POM version -->
<name>Demo</name>

Để tham khảo, bạn có thể xem qua thiết lập đa mô-đun maven

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.