Làm cách nào để tôi bảo Maven sử dụng phiên bản mới nhất của một phụ thuộc?


788

Trong Maven, các phụ thuộc thường được thiết lập như thế này:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

Bây giờ, nếu bạn đang làm việc với các thư viện có bản phát hành thường xuyên, việc cập nhật liên tục thẻ <version> có thể gây khó chịu. Có cách nào để bảo Maven luôn sử dụng phiên bản mới nhất có sẵn (từ kho lưu trữ) không?


@Martin Tôi biết về quy ước xyz-SNAPSHOT, nhưng tôi đã suy nghĩ về các thư viện được phát hành trong các phiên bản cuối cùng cho kho lưu trữ (tức là đi từ dream-library-1.2.3.jar đến dream-library-1.2.4.jar , và như thế).
Anders Sandvig

176
Tôi thực sự không khuyến nghị thực hành này (cũng không sử dụng phạm vi phiên bản) vì mục đích xây dựng khả năng tái tạo. Bản dựng bắt đầu bị lỗi đột ngột vì một lý do không xác định gây khó chịu hơn nhiều so với cập nhật thủ công số phiên bản.
Pascal Thivent

12
@PascalThivent Cập nhật thủ công số phát hành trong pom là một nỗi đau nếu bạn thực hiện phát hành liên tục. Tôi sử dụng plugin phiên bản kết hợp với plugin scm để vượt qua điều này (xem câu trả lời của tôi).
Adam Gent

4
@PascalThivent Cả hai đều gây phiền nhiễu, nhưng theo một cách khác. Tôi muốn lựa chọn giữa cả hai phụ thuộc vào tình huống của tôi và không bị buộc phải sử dụng một vì ai đó quyết định điều này sẽ tốt hơn.
piegames

Câu trả lời:


745

GHI CHÚ:

Câu trả lời này chỉ áp dụng cho Maven 2! Đề cập LATESTRELEASEmetaversions đã được giảm xuống trong Maven 3 "vì lợi ích của tái sản xuất xây dựng" , hơn 6 năm về trước. Vui lòng tham khảo giải pháp tuân thủ Maven 3 này .


Nếu bạn luôn muốn sử dụng phiên bản mới nhất, Maven có hai từ khóa bạn có thể sử dụng thay thế cho phạm vi phiên bản. Bạn nên cẩn thận sử dụng các tùy chọn này vì bạn không còn kiểm soát các plugin / phụ thuộc mà bạn đang sử dụng.

Khi bạn phụ thuộc vào plugin hoặc phụ thuộc, bạn có thể sử dụng giá trị phiên bản là MỚI NHẤT hoặc ĐÁNG TIN CẬY. LATEST đề cập đến phiên bản mới nhất được phát hành hoặc chụp nhanh của một vật phẩm cụ thể, vật phẩm được triển khai gần đây nhất trong một kho lưu trữ cụ thể. RELEASE đề cập đến bản phát hành không chụp nhanh cuối cùng trong kho lưu trữ. Nói chung, nó không phải là một cách thực hành tốt nhất để thiết kế phần mềm mà phụ thuộc vào một phiên bản không cụ thể của một vật phẩm. Nếu bạn đang phát triển phần mềm, bạn có thể muốn sử dụng RELEASE hoặc LATEST một cách thuận tiện để bạn không phải cập nhật số phiên bản khi bản phát hành mới của thư viện bên thứ ba được phát hành. Khi bạn phát hành phần mềm, bạn phải luôn đảm bảo rằng dự án của bạn phụ thuộc vào các phiên bản cụ thể để giảm cơ hội xây dựng hoặc dự án của bạn bị ảnh hưởng bởi bản phát hành phần mềm không thuộc quyền kiểm soát của bạn.

Xem phần Cú pháp POM của sách Maven để biết thêm chi tiết. Hoặc xem tài liệu này về Phạm vi Phiên bản phụ thuộc , trong đó:

  • Dấu ngoặc vuông ( [& ]) có nghĩa là "đóng" (đã bao gồm).
  • Dấu ngoặc đơn ( (& )) có nghĩa là "mở" (độc quyền).

Đây là một ví dụ minh họa các tùy chọn khác nhau. Trong kho lưu trữ Maven, com.foo:my-foo có siêu dữ liệu sau:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

Nếu cần phải phụ thuộc vào tạo phẩm đó, bạn có các tùy chọn sau (tất nhiên các phạm vi phiên bản khác có thể được chỉ định, chỉ hiển thị các tùy chọn có liên quan ở đây):

Khai báo một phiên bản chính xác (sẽ luôn phân giải thành 1.0.1):

<version>[1.0.1]</version>

Khai báo một phiên bản rõ ràng (sẽ luôn giải quyết thành 1.0.1 trừ khi xảy ra xung đột, khi Maven sẽ chọn phiên bản phù hợp):

<version>1.0.1</version>

Khai báo phạm vi phiên bản cho tất cả 1.x (hiện sẽ phân giải thành 1.1.1):

<version>[1.0.0,2.0.0)</version>

Khai báo phạm vi phiên bản kết thúc mở (sẽ phân giải thành 2.0.0):

<version>[1.0.0,)</version>

Khai báo phiên bản là MỚI NHẤT (sẽ phân giải thành 2.0.0) (đã bị xóa khỏi maven 3.x)

<version>LATEST</version>

Khai báo phiên bản dưới dạng ĐÁNG TIN CẬY (sẽ giải quyết 1.1.1) (đã bị xóa khỏi maven 3.x):

<version>RELEASE</version>

Lưu ý rằng theo mặc định, các triển khai của riêng bạn sẽ cập nhật mục nhập "mới nhất" trong siêu dữ liệu Maven, nhưng để cập nhật mục "phát hành", bạn cần kích hoạt "hồ sơ phát hành" từ siêu POM Maven . Bạn có thể làm điều này với "-Prelease-profile" hoặc "-DperformRelease = true"


Cần nhấn mạnh rằng mọi cách tiếp cận cho phép Maven chọn các phiên bản phụ thuộc (LATEST, RELEASE và phạm vi phiên bản) có thể khiến bạn mở để xây dựng các vấn đề về thời gian, vì các phiên bản sau có thể có hành vi khác nhau (ví dụ: plugin phụ thuộc trước đó đã chuyển sang mặc định giá trị từ đúng đến sai, với kết quả khó hiểu).

Do đó, nói chung là một ý tưởng tốt để xác định các phiên bản chính xác trong bản phát hành. Như câu trả lời của Tim chỉ ra, plugin maven-Phiên bản là một công cụ tiện dụng để cập nhật các phiên bản phụ thuộc, đặc biệt là các phiên bản: phiên bản sử dụng phiên bản mới nhấtphiên bản: mục tiêu phát hành mới nhất .


76
Chào người giàu! Dường như RELEASE và đánh dấu phiên bản mới nhất đang không còn được hỗ trợ trong Maven 3.x .
Pascal Thivent

16
Sự phản đối đó dường như chỉ áp dụng cho các plugin chứ không phải phụ thuộc thông thường nếu tôi hiểu đúng tài liệu
Mond Raymond

9
@RichSeller hey Giàu; Tôi đã dành một chút thời gian cho việc này trước khi tôi phát hiện ra điều này không có sẵn trong Maven 3.0 nữa;) Bạn có cân nhắc chỉnh sửa câu trả lời để bắt đầu với bản cập nhật nêu rõ sự phản đối của Maven 3.0 không? Cảm ơn nhiều!
Miquel

6
Tôi tin rằng một sự cân bằng tốt sẽ là khóa phiên bản chính nhưng có được phiên bản nhỏ nhất (hoặc bản vá) mới nhất (tùy theo loại nào được sử dụng để sửa lỗi chỉ trong artifcat mà bạn phụ thuộc). Với cú pháp hiện tại, điều này dường như chỉ có thể xảy ra với một phạm vi như (lưu ý: bắt đầu bằng dấu ngoặc và kết thúc bằng parens):[1.1,2.0)
Amr Mostafa

2
FWIW ... đã cập nhật liên kết đến Ghi chú tương thích Maven3
dyodji

384

Bây giờ tôi biết chủ đề này đã cũ, nhưng đọc câu hỏi và OP cung cấp câu trả lời có vẻ như Plugin Maven Phiên bản có thể thực sự là một câu trả lời tốt hơn cho câu hỏi của anh ấy:

Cụ thể, các mục tiêu sau đây có thể được sử dụng:

  • phiên bản: phiên bản mới nhất sử dụng tìm kiếm pom cho tất cả các phiên bản là phiên bản mới hơn và thay thế chúng bằng phiên bản mới nhất.
  • phiên bản: phiên bản mới nhất sử dụng tìm kiếm pom cho tất cả các phiên bản không phải SNAPSHOT đã được phát hành mới hơn và thay thế chúng bằng phiên bản phát hành mới nhất.
  • phiên bản: thuộc tính cập nhật thuộc tính cập nhật được xác định trong một dự án sao cho chúng tương ứng với phiên bản mới nhất có sẵn của các phụ thuộc cụ thể. Điều này có thể hữu ích nếu tất cả các bộ phụ thuộc phải được khóa thành một phiên bản.

Các mục tiêu khác sau đây cũng được cung cấp:

  • các phiên bản: cập nhật phụ thuộc hiển thị sẽ quét các phụ thuộc của dự án và tạo báo cáo về các phụ thuộc có sẵn phiên bản mới hơn.
  • phiên bản: display-plugin-update quét các plugin của dự án và tạo báo cáo về các plugin có phiên bản mới hơn.
  • phiên bản: update-Parent cập nhật phần cha mẹ của dự án để nó tham chiếu phiên bản mới nhất có sẵn. Ví dụ: nếu bạn sử dụng POM gốc của công ty, mục tiêu này có thể hữu ích nếu bạn cần đảm bảo bạn đang sử dụng phiên bản mới nhất của POM gốc của công ty.
  • các phiên bản: update-child-module cập nhật phần cha của các mô đun con của dự án để phiên bản khớp với phiên bản của dự án hiện tại. Ví dụ: nếu bạn có một pom tổng hợp cũng là cha mẹ cho các dự án mà nó tổng hợp và các phiên bản con và cha mẹ không đồng bộ, mojo này có thể giúp sửa các phiên bản của các mô đun con. (Lưu ý bạn có thể cần phải gọi Maven với tùy chọn -N để chạy mục tiêu này nếu dự án của bạn bị hỏng nặng đến mức không thể xây dựng do phiên bản khớp sai).
  • phiên bản: snap-snapshots tìm kiếm pom cho tất cả các phiên bản -SNAPSHOT và thay thế chúng bằng phiên bản dấu thời gian hiện tại của -SNAPSHOT, ví dụ: -20090327.172306-4
  • phiên bản: Unlock-snapshots tìm kiếm pom cho tất cả các phiên bản snapshot bị khóa dấu thời gian và thay thế chúng bằng -SNAPSHOT.
  • phiên bản: phạm vi giải quyết tìm thấy sự phụ thuộc bằng cách sử dụng phạm vi phiên bản và giải quyết phạm vi cho phiên bản cụ thể đang được sử dụng.
  • phiên bản: phiên bản sử dụng tìm kiếm pom cho tất cả các phiên bản -SNAPSHOT đã được phát hành và thay thế chúng bằng phiên bản phát hành tương ứng.
  • các phiên bản: use-next-phát hành tìm kiếm pom cho tất cả các phiên bản không phải SNAPSHOT đã được phát hành mới hơn và thay thế chúng bằng phiên bản phát hành tiếp theo.
  • phiên bản: use-next-Phiên bản tìm kiếm pom cho tất cả các phiên bản là phiên bản mới hơn và thay thế chúng bằng phiên bản tiếp theo.
  • phiên bản: commit xóa các tệp pom.xml.versionsBackup. Hình thành một nửa của "SCM của người nghèo" tích hợp.
  • phiên bản: hoàn nguyên khôi phục các tệp pom.xml từ các tệp pom.xml.versionsBackup. Hình thành một nửa của "SCM của người nghèo" tích hợp.

Chỉ cần nghĩ rằng tôi bao gồm nó cho bất kỳ tài liệu tham khảo trong tương lai.


10
Trong bối cảnh này, sự khác biệt giữa "phát hành" và "phiên bản".
Ben Noland

1
@BenNoland, tôi tin rằng sự khác biệt trong trường hợp này là phiên bản tiếp theo có thể không cần là một tạo tác phát hành. Ví dụ: được cung cấp một phiên bản nhân tạo 1.0.0-SNAPSHOT, 1.0.0 và 1.0.1-SNAPSHOT và tham chiếu pom đến 1.0.0-SNAPSHOT, các phiên bản: phiên bản tiếp theo và phiên bản: phiên bản tiếp theo sẽ phân giải thành 1.0.0 , trong khi các phiên bản: phiên bản mới nhất và phiên bản: phiên bản mới nhất sẽ phân giải thành 1.0.1-SNAPSHOT và 1.0.0.
Ryan Beesley

1
Bạn có thể giải quyết một số sự không chắc chắn giữa các phiên bản / bản phát hành / ảnh chụp nhanh trong bảng rất hay này tại đây: goo.gl/iDq6PK
Ev0oD

1
In tất cả các mục tiêu có thể và không liên quan là không hữu ích.
MariuszS

2
Tôi nghĩ các phiên bản: phiên bản mới nhất sử dụng sẽ giải quyết được hầu hết các vấn đề của OP.
Alex R

172

Vui lòng xem trang này (phần "Phạm vi phiên bản phụ thuộc"). Những gì bạn có thể muốn làm là một cái gì đó như

<version>[1.2.3,)</version>

Các phạm vi phiên bản này được thực hiện trong Maven2.


Vì một số lý do, tùy chọn này không hiệu quả với tôi, nó đã chọn một phiên bản trong phạm vi nhưng không phải là phiên bản mới nhất.
sorin

4
Bạn có thể muốn xem xét kỹ hơn về cách Maven so sánh số phiên bản - nếu bạn không tuân thủ một mẫu nghiêm ngặt Maven so sánh như chuỗi và không phải số.
Thorbjørn Ravn Andersen

Trang đó nằm trên Codehaus và mô tả chính nó là những thứ "chưa được triển khai cho Maven 2.0" ... Bản thân tài liệu Maven không nói gì về phạm vi phiên bản. Tui bỏ lỡ điều gì vậy? Khi phạm vi phiên bản được giới thiệu? Họ được mô tả ở đâu trong tài liệu chính thức?
Shannon

1
Bạn đã sai, phạm vi phiên bản có nghĩa là tất cả các phiên bản đều ổn từ 1.2.3 trở lên. Đây hoàn toàn không phải là phiên bản mới nhất.
MariuszS

@sorin Có lẽ bạn có những phụ thuộc khác trong dự án của bạn cũng phụ thuộc vào vật phẩm được đề cập? Hãy cố gắng mvn dependency:tree -Dverboseđể tìm ra điều đó. Điều này có thể giải thích phiên bản bất ngờ.
Eugene Beresovsky

83

Không giống như những người khác tôi nghĩ có nhiều lý do tại sao bạn có thể luôn muốn phiên bản mới nhất . Đặc biệt nếu bạn đang triển khai liên tục (đôi khi chúng tôi có 5 bản phát hành trong một ngày) và không muốn thực hiện một dự án đa mô-đun.

Những gì tôi làm là khiến Hudson / Jenkins làm như sau cho mọi bản dựng:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

Đó là tôi sử dụng plugin phiên bản và plugin scm để cập nhật các phụ thuộc và sau đó kiểm tra nó để kiểm soát nguồn. Có, tôi để CI của mình thực hiện kiểm tra SCM (dù sao bạn cũng phải làm cho plugin phát hành maven).

Bạn sẽ muốn thiết lập plugin phiên bản để chỉ cập nhật những gì bạn muốn:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
        <includesList>com.snaphop</includesList>
        <generateBackupPoms>false</generateBackupPoms>
        <allowSnapshots>true</allowSnapshots>
    </configuration>
</plugin>

Tôi sử dụng plugin phát hành để thực hiện việc phát hành chăm sóc -SNAPSHOT và xác nhận rằng có phiên bản phát hành của -SNAPSHOT (rất quan trọng).

Nếu bạn làm những gì tôi làm, bạn sẽ nhận được phiên bản mới nhất cho tất cả các bản dựng ảnh chụp nhanh và phiên bản phát hành mới nhất cho các bản dựng phát hành. Bản dựng của bạn cũng sẽ được tái sản xuất.

Cập nhật

Tôi nhận thấy một số ý kiến ​​hỏi một số chi tiết cụ thể của quy trình này. Tôi sẽ nói rằng chúng tôi không sử dụng phương pháp này nữa và lý do lớn tại sao plugin phiên bản maven bị lỗi và nói chung là thiếu sót.

Thật thiếu sót vì để chạy plugin phiên bản để điều chỉnh các phiên bản, tất cả các phiên bản hiện có cần phải tồn tại để pom chạy chính xác. Đó là plugin phiên bản không thể cập nhật lên phiên bản mới nhất của bất cứ thứ gì nếu nó không thể tìm thấy phiên bản được tham chiếu trong pom. Điều này thực sự khá khó chịu vì chúng tôi thường dọn dẹp các phiên bản cũ vì lý do không gian đĩa.

Thực sự bạn cần một công cụ riêng biệt từ maven để điều chỉnh các phiên bản (vì vậy bạn không phụ thuộc vào tệp pom để chạy chính xác). Tôi đã viết một công cụ như vậy bằng ngôn ngữ thấp kém đó là Bash. Kịch bản sẽ cập nhật các phiên bản như plugin phiên bản và kiểm tra lại pom vào kiểm soát nguồn. Nó cũng chạy nhanh hơn 100 lần so với plugin phiên bản mvn. Thật không may, nó không được viết theo cách sử dụng công cộng nhưng nếu mọi người quan tâm tôi có thể làm như vậy và đặt nó trong một ý chính hoặc github.

Quay trở lại quy trình làm việc khi một số ý kiến ​​hỏi về việc đây là những gì chúng tôi làm:

  1. Chúng tôi có khoảng 20 dự án trong kho riêng của họ với công việc jenkins của riêng họ
  2. Khi chúng tôi phát hành plugin phát hành maven được sử dụng. Quy trình làm việc được đề cập trong tài liệu của plugin. Các plugin phát hành maven loại hút (và tôi đang tử tế) nhưng nó hoạt động. Một ngày nào đó chúng tôi có kế hoạch thay thế phương pháp này bằng một cái gì đó tối ưu hơn.
  3. Khi một trong các dự án được phát hành jenkins sau đó thực hiện một công việc đặc biệt, chúng tôi sẽ gọi cập nhật tất cả các phiên bản công việc (làm thế nào jenkins biết bản phát hành của nó là một cách phức tạp một phần vì plugin phát hành maven jenkins cũng khá nhảm nhí).
  4. Bản cập nhật tất cả các phiên bản công việc biết về tất cả 20 dự án. Nó thực sự là một pom tổng hợp để được cụ thể với tất cả các dự án trong phần mô-đun theo thứ tự phụ thuộc. Jenkins chạy ma thuật Groovy / bash foo của chúng tôi sẽ kéo tất cả các dự án cập nhật các phiên bản mới nhất và sau đó kiểm tra các poms (một lần nữa được thực hiện theo thứ tự phụ thuộc dựa trên phần mô-đun).
  5. Đối với mỗi dự án nếu pom đã thay đổi (do thay đổi phiên bản trong một số phụ thuộc), nó sẽ được kiểm tra và sau đó chúng tôi ngay lập tức ping jenkins để chạy công việc tương ứng cho dự án đó (điều này là để duy trì trật tự phụ thuộc xây dựng nếu không bạn đang thương xót của bộ lập lịch SCM Poll).

Tại thời điểm này, tôi cho rằng việc phát hành và phiên bản tự động là một công cụ riêng biệt với bản dựng chung của bạn là một điều tốt.

Bây giờ bạn có thể nghĩ rằng maven loại hút vì các vấn đề được liệt kê ở trên nhưng điều này thực sự sẽ khá khó khăn với một công cụ xây dựng không có cú pháp khai báo dễ dàng để phân tích cú pháp mở rộng (hay còn gọi là XML).

Trong thực tế, chúng tôi thêm các thuộc tính XML tùy chỉnh thông qua các không gian tên để giúp gợi ý các tập lệnh bash / Groovy (ví dụ: không cập nhật phiên bản này).


5
Cảm ơn vì đã bao gồm một động lực (triển khai liên tục) trong câu trả lời của bạn.
David J. Liszewski

10
Tôi nghĩ rằng điểm quan trọng ở đây là các bản dựng có thể tái tạo bằng phương pháp này, trong khi đó, khi sử dụng phạm vi phiên bản hoặc -LATEST, thì không!
marc.guenther

Tôi muốn thứ hai giải pháp bằng cách sử dụng một công cụ bên ngoài để thay đổi dự án pom trước khi chạy bản dựng. Chúng tôi cũng đang sử dụng phương pháp này vì plugin phiên bản phạm vi vốn đã bị lỗi ví dụ như lấy tài khoản ngày và không chỉ các phiên bản.
Daniel Hajduk

37

Cú pháp phụ thuộc được đặt tại tài liệu Đặc tả yêu cầu phiên bản phụ thuộc . Đây là sự hoàn chỉnh:

versionPhần tử của Dependencies xác định các yêu cầu phiên bản, được sử dụng để tính toán phiên bản phụ thuộc hiệu quả. Yêu cầu phiên bản có cú pháp sau:

  • 1.0: Yêu cầu "Mềm" trên 1.0 (chỉ là một đề xuất, nếu nó phù hợp với tất cả các phạm vi khác cho sự phụ thuộc)
  • [1.0]: Yêu cầu "cứng" trên 1.0
  • (,1.0]: x <= 1.0
  • [1.2,1.3]: 1.2 <= x <= 1.3
  • [1.0,2.0): 1.0 <= x <2.0
  • [1.5,): x> = 1,5
  • (,1.0],[1.2,): x <= 1.0 hoặc x> = 1.2; nhiều bộ được phân tách bằng dấu phẩy
  • (,1.1),(1.1,): cái này không bao gồm 1.1 (ví dụ nếu được biết là không hoạt động kết hợp với thư viện này)

Trong trường hợp của bạn, bạn có thể làm một cái gì đó như <version>[1.2.3,)</version>


15

Bạn có thể phụ thuộc vào các phiên bản phát triển rõ ràng thay đổi rất nhiều trong quá trình phát triển không?

Thay vì tăng phiên bản phát hành phát triển, bạn chỉ có thể sử dụng phiên bản chụp nhanh mà bạn ghi đè khi cần thiết, điều đó có nghĩa là bạn sẽ không phải thay đổi thẻ phiên bản trên mỗi thay đổi nhỏ. Một cái gì đó như 1.0-SNAPSHOT ...

Nhưng có lẽ bạn đang cố gắng để đạt được điều gì khác;)


7

Ai đã từng sử dụng LATEST, vui lòng đảm bảo rằng bạn có -U nếu không ảnh chụp nhanh nhất sẽ không được kéo.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

ngay cả khi sử dụng -UI đang nhận đượcCouldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
Robert

7

Vào thời điểm câu hỏi này được đặt ra, có một số kink với phạm vi phiên bản trong maven, nhưng những câu hỏi này đã được giải quyết trong các phiên bản mới hơn của maven. Bài viết này nắm bắt rất rõ cách thức phạm vi phiên bản hoạt động và thực tiễn tốt nhất để hiểu rõ hơn cách maven hiểu các phiên bản: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htmlm#MAVEN8855


2
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Karl Richter

6

Sự thật là ngay cả trong 3.x nó vẫn hoạt động, đáng ngạc nhiên là các dự án xây dựng và triển khai. Nhưng từ khóa LATEST / RELEASE gây ra vấn đề trong m2e và nhật thực ở khắp mọi nơi, các dự án CSONG phụ thuộc vào sự phụ thuộc được triển khai thông qua LATEST / RELEASE không thể nhận ra phiên bản.

Nó cũng sẽ gây ra vấn đề nếu bạn cố gắng xác định phiên bản là thuộc tính và tham chiếu nó ở nơi khác.

Vì vậy, kết luận là sử dụng các phiên bản-maven-plugin nếu bạn có thể.


5

Đôi khi bạn không muốn sử dụng phạm vi phiên bản, vì dường như chúng "chậm" để giải quyết các phụ thuộc của bạn, đặc biệt là khi có giao hàng liên tục tại chỗ và có hàng tấn phiên bản - chủ yếu trong quá trình phát triển nặng.

Một cách giải quyết khác là sử dụng các phiên bản-maven-plugin . Ví dụ: bạn có thể khai báo một thuộc tính:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

và thêm các phiên bản-maven-plugin vào tệp pom của bạn:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

Sau đó, để cập nhật sự phụ thuộc, bạn phải thực hiện các mục tiêu:

mvn versions:update-properties validate

Nếu có phiên bản mới hơn 1.1.1, nó sẽ cho bạn biết:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

3

Nếu bạn muốn Maven nên sử dụng phiên bản mới nhất của một phụ thuộc, thì bạn có thể sử dụng Plugin Maven phiên bản và cách sử dụng plugin này, Tim đã đưa ra một câu trả lời hay, hãy làm theo câu trả lời của anh ấy .

Nhưng là một nhà phát triển, tôi sẽ không đề xuất loại thực hành này. TẠI SAO?

trả lời tại sao đã được Pascal Thivent đưa ra trong phần bình luận của câu hỏi

Tôi thực sự không khuyến nghị thực hành này (cũng không sử dụng phạm vi phiên bản) vì mục đích xây dựng khả năng tái tạo. Bản dựng bắt đầu bị lỗi đột ngột vì một lý do không xác định gây khó chịu hơn nhiều so với cập nhật thủ công số phiên bản.

Tôi sẽ đề nghị loại thực hành này:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

nó rất dễ bảo trì và dễ gỡ lỗi. Bạn có thể cập nhật POM của bạn ngay lập tức.


nếu bạn sử dụng phiên bản-maven-plugin, bản dựng vẫn có thể tái tạo. Việc cập nhật phiên bản maven có thể được thực hiện trong một cam kết riêng (như bạn có thể thấy từ câu trả lời của tôi, bạn phải chỉ định một mục tiêu riêng, nó chỉ không xảy ra một cách kỳ diệu trong bản dựng).
Markon

1

Giải pháp MY trong maven 3.5.4, sử dụng nexus, trong nhật thực:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

sau đó trong nhật thực : atl + F5, và chọnforce update of snapshots/release

nó làm việc cho tôi


Không làm việc tại dòng lệnh mặc dù vì lý do ably nêu ở trên trong các bài viết khác nhau. Nhiều người trong chúng ta phải tuân thủ các bản dựng tự động và vì vậy các POM của chúng ta phải hoạt động khi chạy ở dòng lệnh, không chỉ trong Eclipse.
bigbadmouse

Tôi đang sử dụng maven 3.5.4 và nhận được điều này khi sử dụng 'mới nhất': là MỚI NHẤT hoặc ĐÁNG TIN CẬY (cả hai đều bị phản đối) @ dòng 154, cột 13
Leonardo Leonardo
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.