Chính xác thì Maven Snapshot là gì và tại sao chúng ta cần nó?


Câu trả lời:


1013

Phiên bản chụp nhanh trong Maven là phiên bản chưa được phát hành.

Ý tưởng là trước khi một 1.0bản phát hành (hoặc bất kỳ bản phát hành nào khác) được thực hiện, tồn tại a 1.0-SNAPSHOT. Phiên bản đó là những gì có thể trở thành 1.0 . Về cơ bản, nó " 1.0đang được phát triển". Điều này có thể gần với một 1.0bản phát hành thực sự , hoặc khá xa (ngay sau khi 0.9phát hành chẳng hạn).

Sự khác biệt giữa phiên bản "thực" và phiên bản chụp nhanh là ảnh chụp nhanh có thể nhận được cập nhật. Điều đó có nghĩa là tải xuống 1.0-SNAPSHOThôm nay có thể cung cấp một tệp khác với tải xuống ngày hôm qua hoặc ngày mai.

Thông thường, các phụ thuộc ảnh chụp nhanh chỉ nên tồn tại trong quá trình phát triển và không có phiên bản được phát hành (tức là không có ảnh chụp nhanh) nên có sự phụ thuộc vào phiên bản chụp nhanh.


67
@amphibient: Không, ảnh chụp nhanh không nhất thiết phải ổn định hơn: nó chỉ là bản dựng mới nhất. Ảnh chụp trước khi phát hành thực tế, nó không đến sau nó. Thật vậy, số phiên bản thường không đề cập đến các chi nhánh.
avandeursen

9
Ảnh chụp nhanh @avandeursen không nhất thiết phải có ngữ nghĩa mà bạn yêu cầu. Bạn có thể có "master-SNAPSHOT" và sau đó tạo bản phát hành 1.0. nó không phải là "FutureVersion-SNAPSHOT", cũng không nhất thiết phải có trước khi phát hành. Mọi thứ khác đều đúng - đó là một tham chiếu không ổn định cho mục tiêu đang di chuyển và không thể dựa vào để tạo ra một bản dựng lặp lại.
Scott Carey

3
Cảm ơn @ScottCarey. "Thông thường đi trước" có lẽ sẽ chính xác hơn, vì thậm chí không có gì đảm bảo rằng "mục tiêu di động" cuối cùng sẽ tồn tại.
avandeursen

1
@Jay: không, theo như tôi biết thì không có cách nào để tham chiếu rõ ràng một SNAPSHOT cụ thể, chúng không thể đánh địa chỉ / có thể hoán đổi cho nhau theo thiết kế. Nếu bạn cần phiên bản chi tiết, thì bạn chỉ nên phát hành các ứng cử viên phát hành với các chuỗi phiên bản cụ thể (-RC1, -RC2 hoặc đại loại như thế).
Joachim Sauer

14
Tại sao họ không thể gọi nó là " 1.0-DEVELOPMENT" hoặc thích " 1.0-INPROGRESS", tại sao mọi người phải sử dụng các thuật ngữ không rõ ràng
uh_big_mike_boi

792

Ba câu trả lời khác cung cấp cho bạn một tầm nhìn tốt về -SNAPSHOTphiên bản là gì. Tôi chỉ muốn thêm một số thông tin liên quan đến hành vi của Maven khi nó tìm thấy sự SNAPSHOTphụ thuộc.

Khi bạn xây dựng một ứng dụng, Maven sẽ tìm kiếm các phụ thuộc trong kho lưu trữ cục bộ . Nếu không tìm thấy phiên bản ổn định ở đó, nó sẽ tìm kiếm các kho lưu trữ từ xa (được xác định trong settings.xmlhoặc pom.xml) để truy xuất phụ thuộc này. Sau đó, nó sẽ sao chép nó vào kho lưu trữ cục bộ, để làm cho nó có sẵn cho các bản dựng tiếp theo.

Ví dụ: foo-1.0.jarthư viện được coi là phiên bản ổn định và nếu Maven tìm thấy nó trong kho lưu trữ cục bộ, nó sẽ sử dụng thư viện này cho bản dựng hiện tại.

Bây giờ, nếu bạn cần một foo-1.0-SNAPSHOT.jarthư viện, Maven sẽ biết rằng phiên bản này không ổn định và có thể thay đổi. Đó là lý do tại sao Maven sẽ cố gắng tìm một phiên bản mới hơn trong kho từ xa, ngay cả khi một phiên bản của thư viện này được tìm thấy trên kho lưu trữ cục bộ. Tuy nhiên, kiểm tra này chỉ được thực hiện một lần mỗi ngày. Điều đó có nghĩa là nếu bạn có foo-1.0-20110506.110000-1.jar(tức là thư viện này đã được tạo vào ngày 2011/05/06 lúc 11:00:00) trong kho lưu trữ cục bộ của bạn và nếu bạn chạy lại bản dựng Maven cùng ngày, Maven sẽ không kiểm tra kho lưu trữ cho phiên bản mới hơn.

Maven cung cấp cho bạn một cách để thay đổi chính sách cập nhật này trong định nghĩa kho lưu trữ của bạn:

<repository>
    <id>foo-repository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

nơi XXXcó thể:

  • luôn luôn : Maven sẽ kiểm tra phiên bản mới hơn trên mọi bản dựng;
  • hàng ngày , giá trị mặc định;
  • khoảng thời gian: XXX : một khoảng thời gian tính bằng phút (XXX)
  • never : Maven sẽ không bao giờ thử lấy phiên bản khác. Nó sẽ làm điều đó chỉ khi nó không tồn tại cục bộ. Với cấu hình, SNAPSHOTphiên bản sẽ được xử lý như các thư viện ổn định.

(mô hình của tệp cài đặt có thể được tìm thấy ở đây)


2
Có vẻ như có thể sử dụng chuyển đổi dòng lệnh để buộc maven tải lại tất cả các SNAPSHOTphiên bản: mvn clean package -Utheo hướng dẫn của maven
Dimitry K

3
Cẩn thận với -Ucờ. Nó có thể không làm những gì bạn mong đợi do MNG-4142 .
Kevin Cross

3
Cũng đáng đề cập rằng thực tiễn tốt yêu cầu bạn không sử dụng phụ thuộc ảnh chụp nhanh khi bạn đến để tạo phiên bản phát hành và thực sự Plugin Maven Release sẽ thất bại nếu có phụ thuộc ảnh chụp nhanh.
RCross

2
Tôi đã chạy mvn installđể cài đặt một phiên bản 1.0-SNAPSHOT vào repo cục bộ của mình. Ngày hôm sau tôi thực hiện các thay đổi cho dự án nhưng không thay đổi phiên bản - sau đó khi chạy, mvn installnó dường như không thay đổi nó trong repo địa phương của tôi. Đó có phải là hành vi dự kiến? Tôi không thể sử dụng lại một phiên bản và ghi đè lên nó mvn installsau khi thay đổi nó?
Don Cheadle

1
@mmcrae AFAIK cần được cập nhật. Đó là những gì mục tiêu cài đặt làm, cập nhật các lọ SNAPSHOT cục bộ. Bạn đã phát hiện ra cái gì khác?
Johnny

73

Thuật ngữ "SNAPSHOT" có nghĩa là bản dựng là ảnh chụp nhanh mã của bạn tại một thời điểm nhất định.

Nó thường có nghĩa là phiên bản này vẫn đang được phát triển nặng.

Khi mã đã sẵn sàng và đã đến lúc phát hành nó, bạn sẽ muốn thay đổi phiên bản được liệt kê trong POM. Sau đó, thay vì có "SNAPSHOT", bạn sẽ sử dụng nhãn như "1.0".

Để được trợ giúp với phiên bản, hãy xem đặc tả Phiên bản ngữ nghĩa .


Về mặt phiên bản ngữ nghĩa , bản phát hành -SNAPSHOT sẽ là bản phát hành trước: " Phiên bản tiền phát hành cho thấy phiên bản không ổn định và có thể không đáp ứng các yêu cầu tương thích dự định như được biểu thị bởi phiên bản thông thường được liên kết của nó. Ví dụ: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen

3
Nghe có vẻ như "SNAPSHOT" không phải là "ảnh chụp mã của bạn tại một thời điểm cụ thể" mà là "bản dựng mã mới nhất hiện có." Nếu đây là HTTP, thì đó sẽ là lá cờ có nội dung: "Đừng bận tâm làm TRƯỚC, hãy lấy bất cứ thứ gì có trên máy chủ." Thật vậy, nó gần như ngược lại "mã tại một thời điểm nhất định."
lilbyrdie

Phát triển "nặng" là gì?
Joker

1
@Joker "nặng" là khi nhiều thứ đang thay đổi (tính năng mới, tái cấu trúc, v.v.)
robert

28

"Bản phát hành" là bản dựng cuối cùng cho phiên bản không thay đổi.

"Ảnh chụp nhanh" là bản dựng có thể được thay thế bằng bản dựng khác có cùng tên. Nó ngụ ý rằng bản dựng có thể thay đổi bất cứ lúc nào và vẫn đang được phát triển tích cực.

Bạn có các tạo phẩm khác nhau cho các bản dựng khác nhau dựa trên cùng một mã. Ví dụ, bạn có thể có một với gỡ lỗi và một không có. Một cho Java 5.0 và một cho Java 6. Nói chung đơn giản hơn để có một bản dựng thực hiện mọi thứ bạn cần. ;)


21

Các phiên bản Maven có thể chứa một chuỗi "SNAPSHOT" theo nghĩa đen để biểu thị rằng một dự án hiện đang được phát triển tích cực.

Ví dụ: nếu dự án của bạn có phiên bản của 1.0 1.0-SNAPSHOT, và bạn triển khai các tạo phẩm của dự án này vào kho lưu trữ của Maven, Maven sẽ mở rộng phiên bản này thành Phiên bản 1.0-20080207-230804-1, nếu bạn triển khai một bản phát hành vào lúc 11 : 08 PM ngày 7 tháng 2 năm 2008 UTC. Nói cách khác, khi bạn triển khai một ảnh chụp nhanh, bạn sẽ không phát hành một thành phần phần mềm; bạn đang phát hành một ảnh chụp nhanh của một thành phần tại một thời điểm cụ thể.

Vì vậy, chủ yếu các phiên bản chụp nhanh được sử dụng cho các dự án đang được phát triển tích cực. Nếu dự án của bạn phụ thuộc vào thành phần phần mềm đang được phát triển tích cực, bạn có thể phụ thuộc vào bản phát hành ảnh chụp nhanh và Maven sẽ định kỳ tải xuống ảnh chụp nhanh mới nhất từ ​​kho lưu trữ khi bạn chạy bản dựng. Tương tự, nếu phiên bản tiếp theo của hệ thống của bạn sắp có phiên bản phiên bản 1.8, thì dự án của bạn sẽ có phiên bản Phiên bản 1.8 1.8-SNAPSHOT cho đến khi được phát hành chính thức.

Ví dụ: phần phụ thuộc sau sẽ luôn tải xuống JAR phát triển 1.8 mới nhất của mùa xuân:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

Một ví dụ về quy trình phát hành maven

nhập mô tả hình ảnh ở đây


6

Tôi muốn đưa ra một quan điểm về thuật ngữ. Các câu trả lời khác đã đưa ra những lời giải thích tốt về phiên bản "ảnh chụp nhanh" trong bối cảnh của Maven. Nhưng nó có tuân theo phiên bản không chụp nhanh nên được gọi là phiên bản "phát hành" không?

Có một số căng thẳng giữa ý tưởng phiên bản ngữ nghĩa của phiên bản "phát hành", dường như là bất kỳ phiên bản nào không có vòng loại như -SNAPSHOTnhưng cũng không có vòng loại như -beta.4; và ý tưởng ý tưởng của Maven về một phiên bản "phát hành", dường như chỉ bao gồm sự vắng mặt của -SNAPSHOT.

Nói cách khác, có một sự mơ hồ về ngữ nghĩa về việc "phát hành" có nghĩa là "chúng tôi có thể phát hành nó cho Maven Central" hay "phần mềm này được phát hành ra công chúng". Chúng tôi có thể coi -beta.4là phiên bản "phát hành" nếu chúng tôi phát hành ra công chúng, nhưng nó không phải là "phiên bản cuối cùng". Phiên bản ngữ nghĩa rõ ràng nói rằng một cái gì đó giống như -beta.4là phiên bản "tiền phát hành", vì vậy sẽ không có nghĩa là nó được gọi là phiên bản "phát hành", ngay cả khi không có -SNAPSHOT. Trong thực tế theo định nghĩa thậm chí -rc.5là một ứng cử viên phát hành , không phải là một bản phát hành thực tế, mặc dù chúng tôi có thể cho phép truy cập công cộng để thử nghiệm.

Vì vậy, Maven mặc dù, theo tôi, có vẻ phù hợp hơn khi chỉ gọi một phiên bản "phát hành" mà không có bất kỳ vòng loại nào, thậm chí không -beta.4. Có lẽ một cái tên tốt hơn cho phiên bản không chụp nhanh của Maven sẽ là phiên bản "ổn định" (lấy cảm hứng từ câu trả lời khác ). Do đó, chúng ta sẽ có:

  • 1.2.3-beta.4-SNAPSHOT: Phiên bản chụp nhanh của phiên bản tiền phát hành.
  • 1.2.3-SNAPSHOT: Phiên bản chụp nhanh của phiên bản phát hành.
  • 1.2.3-beta.4: Phiên bản ổn định của phiên bản tiền phát hành.
  • 1.2.3: Một phiên bản phát hành (rõ ràng là phiên bản ổn định, không chụp nhanh).

Bạn có bất kỳ thông tin nào về cách maven đối phó với việc xây dựng siêu dữ liệu hoặc quy ước đặt tên trước khi phát hành không? Ý tôi là, tất cả chúng ta đều biết rằng alfa có beta, nhưng maven có biết không? Ngay cả khi nó mất 1.2.3-beta.4 như một bản phát hành ổn định, thì ít nhất nó có biết rằng 1.2.3 là SAU không?
DGoiko

5

Đây là cách ảnh chụp nhanh cho kho lưu trữ và trong trường hợp này không được bật, điều đó có nghĩa là kho lưu trữ được đề cập ở đây ổn định và không cần cập nhật.

<project>
    ...
    <repositories>
        <repository>
            <id>lds-main</id>
            <name>LDS Main Repo</name>
            <url>http://code.lds.org/nexus/content/groups/main-repo</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

Một trường hợp khác sẽ là:

<snapshots>
        <enabled>true</enabled>
</snapshots>

có nghĩa là Maven sẽ tìm kiếm các bản cập nhật cho kho lưu trữ này. Bạn cũng có thể chỉ định một khoảng thời gian cho các bản cập nhật với thẻ.


5

thông thường trong maven, chúng tôi có hai loại bản dựng 1) Bản dựng ảnh chụp nhanh 2) Bản dựng phát hành

  1. bản dựng snapshot: SNAPSHOT là phiên bản đặc biệt chỉ ra bản sao triển khai hiện tại không giống như phiên bản thông thường, maven kiểm tra phiên bản cho mọi bản dựng trong kho lưu trữ từ xa để bản dựng snapshot không là gì ngoài bản dựng phát triển.

  2. Bản dựng phát hành: Bản phát hành có nghĩa là loại bỏ SNAPSHOT tại phiên bản dành cho bản dựng, đây là các phiên bản bản dựng thông thường.


3

chỉ đơn giản là ảnh chụp nhanh có nghĩa là phiên bản không ổn định.

khi phiên bản bao gồm ảnh chụp nhanh như 1.0.0 -SNAPSHOT có nghĩa là phiên bản không ổn định và tìm kho lưu trữ từ xa để giải quyết phụ thuộc


1

hiểu ngữ cảnh của SDLC sẽ giúp hiểu được sự khác biệt giữa ảnh chụp nhanh và bản phát hành. Trong quá trình phát triển, tất cả các nhà phát triển đều đóng góp các tính năng của họ cho một nhánh cơ sở. Tại một số điểm, khách hàng tiềm năng nghĩ rằng đủ các tính năng đã tích lũy, sau đó anh ta sẽ cắt một nhánh phát hành khỏi nhánh cơ sở. Bất kỳ bản dựng nào trước thời điểm này đều là ảnh chụp nhanh. Xây dựng bài đến thời điểm này là phát hành. Lưu ý, bản dựng phát hành cũng có thể thay đổi trước khi đi vào sản xuất nếu có bất kỳ lỗi nào trong quá trình thử nghiệm phát hành.


1

Ảnh chụp đơn giản có nghĩa là tùy thuộc vào cấu hình của bạn, Maven sẽ kiểm tra các thay đổi mới nhất về một phụ thuộc đặc biệt. Ảnh chụp không ổn định vì nó đang được phát triển nhưng nếu trong một dự án đặc biệt cần có những thay đổi mới nhất, bạn phải định cấu hình phiên bản phụ thuộc của mình thành phiên bản chụp nhanh. Kịch bản này xảy ra trong các tổ chức lớn với nhiều sản phẩm mà các sản phẩm này liên quan với nhau rất chặt chẽ.


0

Như tên cho thấy, ảnh chụp nhanh đề cập đến trạng thái của dự án và các phụ thuộc của nó tại thời điểm đó. Bất cứ khi nào maven tìm thấy một SNAPSHOT mới hơn của dự án, nó sẽ tải xuống và thay thế tệp .jar cũ hơn của dự án trong kho lưu trữ cục bộ.

Phiên bản chụp nhanh được sử dụng cho các dự án đang được phát triển tích cực. Nếu dự án của bạn phụ thuộc vào thành phần phần mềm đang được phát triển tích cực, bạn có thể phụ thuộc vào bản phát hành ảnh chụp nhanh và Maven sẽ định kỳ tải xuống ảnh chụp nhanh mới nhất từ ​​kho lưu trữ khi bạn chạy bản dựng.

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.