Cập nhật số phiên bản của các mô-đun trong dự án Maven đa mô-đun


325

Tôi có một dự án maven đa mô-đun. Chúng tôi dự định phiên bản tất cả các mô-đun với nhau. Nhưng đến bây giờ tôi sẽ kết thúc phiên bản mã hóa cứng trong mỗi mô-đun pom.xml như bên dưới

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

và mô đun cha chính có cấu hình bên dưới

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>

1
Câu hỏi của bạn bị sai lệch và gây nhầm lẫn cho những người có POM đa mô-đun ("tổng hợp") thực sự. Từ ví dụ của bạn và từ các câu trả lời, có vẻ như bạn thực sự đang nói về POM gốc, không phải là POM tổng hợp, đa mô-đun. Xem maven.apache.org/pom.html#Aggregation .
Garret Wilson

Câu trả lời:


631

Sử dụng versions:settừ plugin phiên bản-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Nó sẽ điều chỉnh tất cả các phiên bản pom, phiên bản cha và phiên bản phụ thuộc trong một dự án đa mô-đun.

Nếu bạn làm sai, hãy làm

mvn versions:revert

sau đó, hoặc

mvn versions:commit

nếu bạn hài lòng với kết quả.


Lưu ý: giải pháp này giả định rằng tất cả các mô-đun sử dụng pom tổng hợp cũng là pom gốc, một kịch bản được coi là tiêu chuẩn tại thời điểm trả lời này. Nếu đó không phải là trường hợp, đi cho câu trả lời của Garret Wilson .


5
Sẽ thật tuyệt nếu có một giải pháp không yêu cầu bạn thực sự thay đổi từng mô-đun. Sự thay thế duy nhất tôi có thể nghĩ đến là luôn sử dụng phiên bản chụp nhanh cho cha mẹ.
AmanicA

54
Ngoài ra, người versions:setta có thể chỉ định -DgenerateBackupPoms=false, theo mặc định, plugin này sao lưu các tệp pom gốc.
Maksim Sorokin

20
Đó là điểm của versions:commit: "Loại bỏ bản sao lưu ban đầu của pom, do đó chấp nhận các thay đổi."
Michael Laffargue

2
Một plugin mới giải quyết vấn đề được mô tả trong câu hỏi này theo cách khác: mojo.codehaus.org/flatten-maven-plugin/examples/ Kẻ
Stephan

1
Các phiên bản mvn @MichaelLaffargue: commit dường như xóa các tệp sao lưu được tạo của pom.xml trước đó
Cris Rockwell

58

Câu trả lời cho rằng dự án trong câu hỏi sử dụng kế thừa dự án ngoài tập hợp mô-đun. Trong thực tế đó là những khái niệm riêng biệt:

https://maven.apache.org/guides/int sinhtion / int sinhtion-to-the-pom.html # Project_Inherribution_vs_Project_Aggregation

Một số dự án có thể là tập hợp các mô-đun, nhưng không có mối quan hệ cha-con giữa POM tổng hợp và các mô-đun tổng hợp. (Có thể hoàn toàn không có mối quan hệ cha-con hoặc các mô-đun con có thể sử dụng POM riêng hoàn toàn làm "cha mẹ".) Trong những tình huống này, câu trả lời đã cho sẽ không hoạt động.

Sau khi đọc và thử nghiệm nhiều, hóa ra có một cách để sử dụng Plugin Maven Phiên bản để cập nhật không chỉ POM tổng hợp mà còn tất cả các mô-đun tổng hợp; nó là processAllModuleslựa chọn Lệnh sau phải được thực hiện trong thư mục của dự án tập hợp:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

Plugin Maven Phiên bản sẽ không chỉ cập nhật các phiên bản của tất cả các mô-đun có chứa, nó cũng sẽ cập nhật các phụ thuộc giữa các mô-đun !!!! Đây là một chiến thắng lớn và sẽ tiết kiệm rất nhiều thời gian và ngăn chặn tất cả các loại vấn đề.

Tất nhiên đừng quên cam kết các thay đổi trong tất cả các mô-đun, điều mà bạn cũng có thể thực hiện với cùng một công tắc:

mvn versions:commit -DprocessAllModules

Bạn có thể quyết định phân phối với POMS dự phòng hoàn toàn và thực hiện mọi thứ trong một lệnh:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false

Làm cách nào để chúng tôi tự động hóa phiên bản tiếp theo cũng giống như plugin xây dựng trình trợ giúp?
lostintranslation

Sử dụng Maven 3.5.0 Tôi không thể làm việc này. Tôi có tổng hợp dự án và chỉ có pom cha mẹ được cập nhật. Tôi cũng đã thử kế thừa dự án (cùng với tổng hợp - "cả ba quy tắc" từ liên kết được cung cấp) và một lần nữa chỉ có phụ huynh mới được cập nhật.
SiKing

1
Tìm thấy công tắc bí mật make-it-work: phiên bản bắt đầu của pom gốc và các mô-đun phải giống nhau! Pom cha mẹ của tôi đã bắt đầu với "1-SNAPSHOT" và các mô-đun có "1.0.0-SNAPSHOT". :)
SiKing

1
Với một dự án tổng hợp, phiên bản của trình tổng hợp và các phiên bản của các mô hình con không nhất thiết phải giống nhau. (Ví dụ, pom tổng hợp của bạn chỉ có thể thay đổi hiếm khi và có thể ở một phiên bản cụ thể, trong khi các mô đun con riêng lẻ có thể có chu kỳ phát hành riêng). Thuộc tính chính để chỉ định cho versions:setplugin là -DoldVersion='*', trên mojohaus.org/versions-maven-plugin/set-mojo.html nó nói rõ ràng thuộc tính này nên được chỉ định khi xử lý dự án tổng hợp.
Matthew Wise

2
Trong những điều kiện -DprocessAllModulesthực sự làm việc? Nó không làm việc cho tôi.
Alex R

24

Nếu bạn muốn tự động hóa hoàn toàn quy trình (tức là bạn muốn tăng số phiên bản mà không cần phải biết số phiên bản hiện tại là gì), bạn có thể làm điều này:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
Cảm ơn, @Crummy, bạn đã cứu ngày của tôi
Maksim Kostromin


Hoặc bạn có thể sử dụng-DoldVersion='*'
Matthew Wise

23

Bạn có thể muốn xem xét bản phát hành của plugin phát hành Maven : mục tiêu phiên bản cập nhật . Nó sẽ cập nhật phiên bản của cha mẹ cũng như tất cả các mô-đun bên dưới nó.


Cập nhật: Xin lưu ý rằng ở trên là plugin phát hành. Nếu bạn không phát hành, bạn có thể muốn sử dụngversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
phiên bản mvn: thiết lập không ảnh hưởng đến các mô-đun.
9ilsdx 9rvj 0lo


OK nó làm khi xây dựng lò phản ứng trong cùng một thời gian cha mẹ. Thật khó hiểu khi cấu trúc trông khác ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmoduleslàm việc tốt cho tôi, ngay cả khi tôi không phát hành :-)
msa

11

Tôi khuyến khích bạn đọc Sách Maven về các bản dựng đa mô-đun (lò phản ứng).

Ý tôi là cụ thể như sau:

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

nên đổi thành. Ở đây quan tâm đến phiên bản không được xác định chỉ trong phần cha mẹ nó được xác định.

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

Đây là một liên kết tốt hơn .


10
và tìm kiếm những gì cụ thể?
Thorbjørn Ravn Andersen

2
+1 để hiển thị định dạng phù hợp cho pom.xmlcác tệp, nhưng tôi đồng ý (với @ ThorbjørnRavnAndersen) rằng việc đọc toàn bộ sách cho thông tin này là quá mức cần thiết. : p
Priidu Neemre

7
Thật không may, việc kế thừa thông tin phiên bản từ cha mẹ không xóa bỏ gánh nặng phải sửa đổi tất cả các tệp pom trong dự án - bởi vì tất cả chúng đều tham chiếu cha mẹ theo số phiên bản .
Steven dễ dàng thích thú

1
Bạn có thể sử dụng các phiên bản-maven-plugin xử lý tất cả những thứ này hoặc bạn có thể sử dụng plugin maven-release-plugin và vì vậy bạn không cần phải xử lý thủ công này ...
khmarbaise

5

versions:update-child-modulesâm thanh như những gì bạn đang tìm kiếm. Bạn có thể thực hiện các phiên bản: thiết lập như đã đề cập, nhưng đây là một cách nhẹ nhàng để cập nhật số phiên bản gốc. Đối với các mô đun con, theo ý kiến ​​của tôi, bạn nên xóa các <version>định nghĩa, vì chúng sẽ kế thừa số phiên bản của mô đun mẹ.


3

Cách tốt nhất là, vì bạn có ý định kết hợp các mô-đun của mình lại với nhau, bạn có thể chỉ định <dependencyManagement>thẻ ở bên ngoài hầu hết pom.xml(mô-đun mẹ) trực tiếp dưới <project>thẻ. Nó kiểm soát phiên bản và tên nhóm. Trong mô-đun cá nhân của bạn, bạn chỉ cần xác định <artifactId>thẻ trong pom.xml. Nó sẽ lấy phiên bản từ tập tin cha.


Tôi không thể tìm thấy sự phụ thuộc thẻ Quản lý trên pom.xml . Bạn đang suy nghĩ về một cái gì đó khác ?
ArturoTena

0

cách dễ nhất là thay đổi phiên bản trong mọi pom.xml thành phiên bản tùy ý. sau đó kiểm tra xem quản lý phụ thuộc để sử dụng phiên bản chính xác của mô-đun được sử dụng trong mô-đun này! ví dụ, nếu bạn muốn tăng phiên bản cho dự án mô-đun kéo, bạn phải thực hiện như chảy:

trong mô đun con:

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

và trong mô đun cha mẹ:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>

0

Để cập nhật pom.xml chính và phiên bản chính trên các mô hình con:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
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.