Làm cách nào tôi có thể khiến Maven ngừng cố gắng kiểm tra các bản cập nhật cho các vật phẩm từ một nhóm nhất định từ maven-trung tâm-repo?


126

Tôi đang làm việc trong một dự án Maven khá lớn. Chúng tôi có lẽ có khoảng 70 hoặc nhiều đồ tạo tác riêng lẻ, được chia thành hai thư viện mã chia sẻ và có thể mười ứng dụng sử dụng chúng. Tất cả các mục này sống trong không gian tên com.mycompany.*.

Hầu hết thời gian chúng tôi đang chạy chống lại các bản dựng snapshot. Vì vậy, để xây dựng một ứng dụng đầy đủ, trước tiên tôi có thể xây dựng các dự án thư viện để chúng được cài đặt vào kho lưu trữ cục bộ của tôi (như, giả sử, mycompany-libname-2.4-SNAPSHOT.jar).

Vấn đề là khi tôi đi xây dựng các ứng dụng. Vì một số lý do, Maven muốn kiểm tra hai kho lưu trữ công cộng chính (maven-net-repo và java-net-repo) để cập nhật cho tất cả các mycompany-*-SNAPSHOT.jartạo phẩm. Tất nhiên, họ không tìm thấy ở đó, và mọi thứ cuối cùng đã giải quyết trở lại các phiên bản tôi vừa xây dựng cho kho lưu trữ cục bộ của mình, nhưng tôi muốn Maven ngừng làm điều này bởi vì (a) nó khiến tôi cảm thấy như một net.citizen tồi để liên tục kiểm tra các kho lưu trữ này cho những thứ sẽ không bao giờ có ở đó và (b) nó sẽ thêm một số độ trễ mạng không cần thiết và gây phiền nhiễu vào quá trình xây dựng của tôi.

Tôi đã từng chạy maven ở chế độ ngoại tuyến hầu hết thời gian để giải quyết vấn đề này, nhưng điều đó không lý tưởng vì đôi khi một sự phụ thuộc vào thư viện công cộng sẽ được cập nhật. Vì vậy, điều tôi đang tìm kiếm là một giải pháp sẽ khiến Maven không kiểm tra các bản cập nhật từ các kho lưu trữ đã cho đáp ứng các tiêu chí nhất định - trong trường hợp này, tôi rất vui nếu Maven bỏ qua các phiên bản SNAPSHOT hoặc các tạo tác trong đó các com.mycompanynamespace.

Câu trả lời:


34

Thẻ updatePolicy không hoạt động với tôi. Tuy nhiên, Rich Sell đã đề cập rằng các snapshot nên bị vô hiệu hóa vì vậy tôi đã nhìn xa hơn và nhận thấy rằng kho lưu trữ bổ sung mà tôi đã thêm vào tệp settings.xml của mình thực sự gây ra sự cố. Việc thêm phần ảnh chụp nhanh vào kho lưu trữ này trong tệp cài đặt của tôi đã thực hiện thủ thuật!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>

Cảm ơn bạn rất nhiều cho câu trả lời. Cuối cùng nó đã giúp tôi. Tôi đã gặp một số rắc rối với tải xuống ảnh chụp nhanh cho một trong các kho lưu trữ. Tải xuống được treo ngay cả với cảnh sát cập nhật không bao giờ. Bây giờ ảnh chụp nhanh không được tải xuống chính xác mà tôi muốn.
wolfroma

163

Ngoài ra, bạn có thể sử dụng -ohoặc --offlinetrong dòng lệnh mvn sẽ đưa maven vào "chế độ ngoại tuyến" để nó không kiểm tra cập nhật. Bạn sẽ nhận được một số cảnh báo về việc không thể có được sự phụ thuộc chưa có trong repo địa phương của bạn, nhưng không có vấn đề gì lớn.


8
Điều này cũng sẽ ngăn maven tải xuống các phụ thuộc được phát hành. Bạn có thể muốn có một phiên bản mới hơn của thư viện được phát hành, mà không có ảnh chụp nhanh nào được kiểm tra để cập nhật
hobgoblin

2
Đây là rõ ràng không phải là một câu trả lời cho câu hỏi ban đầu! Làm thế nào nó có thể có rất nhiều upvote ??? OP đã viết rõ ràng rằng anh ấy đã thử chạy maven ở chế độ ngoại tuyến nhưng nó không lý tưởng cho mục đích của anh ấy!
Honza Zidek

95

Một cái gì đó hiện có sẵn trong maven là

mvn goal --no-snapshot-updates

hoặc trong ngắn hạn

mvn goal -nsu

3
Chỉ trong trường hợp bất kỳ người SBT nào hạ cánh ở đây: set offline := truetrong phiên hoặc offline := truetrong build.sbt.
opyate

5
Ngoài ra, nsutùy chọn bị hỏng trong phiên bản 3.0.3 (Xem MNG-5064 ). Để sử dụng tùy chọn này một cách đáng tin cậy, bạn có thể cần nâng cấp lên ít nhất là phiên bản 3.0.4 hoặc câu 3.0.5
Ashutosh Jindal

đẹp nhất
AntJavaDev

32

Cập nhật: Có lẽ tôi nên bắt đầu với điều này vì các dự án của bạn là SNAPSHOT. Đây là một phần của ngữ nghĩa SNAPSHOT mà Maven sẽ kiểm tra các bản cập nhật trên mỗi bản dựng. Trở thành SNAPSHOT có nghĩa là nó không ổn định và có thể thay đổi, vì vậy các bản cập nhật cần được kiểm tra. Tuy nhiên, đáng để chỉ ra rằng siêu POM Maven cấu hình trung tâm để tắt các ảnh chụp nhanh, vì vậy Maven không bao giờ nên kiểm tra các bản cập nhật cho SNAPSHOT ở trung tâm trừ khi bạn đã ghi đè lên trong cài đặt pom / của riêng bạn.


Bạn có thể định cấu hình Maven để sử dụng máy nhân bản cho kho lưu trữ trung tâm, điều này sẽ chuyển hướng tất cả các yêu cầu thường đi vào trung tâm đến kho lưu trữ nội bộ của bạn.

Trong tệp cài đặt của bạn, bạn sẽ thêm một cái gì đó như thế này để đặt kho lưu trữ nội bộ của bạn làm gương cho trung tâm:

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

Nếu bạn đang sử dụng trình quản lý kho lưu trữ như Nexus cho kho lưu trữ nội bộ của mình. Bạn có thể thiết lập kho lưu trữ proxy cho trung tâm proxy, do đó, mọi yêu cầu thường đi đến Trung tâm thay vào đó sẽ được gửi đến kho lưu trữ proxy của bạn (hoặc nhóm kho chứa proxy) và các yêu cầu tiếp theo được lưu trong bộ quản lý kho lưu trữ nội bộ. Bạn thậm chí có thể đặt thời gian chờ bộ đệm proxy thành -1, vì vậy nó sẽ không bao giờ yêu cầu nội dung từ trung tâm đã có trên kho lưu trữ proxy.


Một giải pháp cơ bản hơn nếu bạn chỉ làm việc với các kho lưu trữ cục bộ là đặt updatePolicy cho kho lưu trữ trung tâm thành "không bao giờ", điều này có nghĩa là Maven sẽ chỉ kiểm tra các tạo phẩm chưa có trong kho lưu trữ cục bộ. Điều này sau đó có thể được ghi đè tại dòng lệnh khi cần bằng cách sử dụng công tắc -U để buộc Maven kiểm tra các bản cập nhật.

Bạn sẽ định cấu hình kho lưu trữ (trong pom của bạn hoặc cấu hình trong tệp settings.xml) như sau:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>

Chúng tôi thực sự đã có một kho lưu trữ trung tâm, nhưng tất nhiên chúng tôi không xuất bản các bản dựng snapshot cho nó, vì vậy có lẽ tôi vẫn nhận được các bản kiểm tra cập nhật thất bại với proxy / máy nhân bản - Tôi đang tìm cách để có được Maven để không kiểm tra cập nhật tất cả cho các hiện vật này.
Tim Gilbert

1
Cũng đáng thiết lập một kho lưu trữ logic trên kho lưu trữ trung tâm cho SNAPSHOT của bạn. Điều này có nghĩa là chúng có thể được chia sẻ giữa các nhà phát triển của bạn và bạn không cần phải xây dựng tất cả chúng tại địa phương. Sau đó, bạn sẽ nhận được toàn bộ lợi ích của SNAPSHOT bằng cách chọn các thay đổi đối với bất kỳ phụ thuộc SNAPSHOT nào ngay khi chúng được đẩy vào kho lưu trữ từ xa.
Người bán giàu có

Cảm ơn - cờ updatePolicy trông giống hệt những gì tôi đang tìm kiếm.
Tim Gilbert

1
Nexus cũng cho phép bạn định cấu hình các quy tắc để ngăn chặn mọi yêu cầu đối với các tạo phẩm của công ty ra bên ngoài.
Brian Fox

Đoạn mã XML ở đây đã hết hạn. Phần updatePolicytử đi theo phần tử snapshotshoặc releases. Xem: maven.apache.org/sinstall.html
Jeff Evans

5

Rất đơn giản :

Trong cha mẹ Super POM hoặc tệp cài đặt của bạn, hãy sử dụng

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

Đó là lời khuyên của tôi


0

Tôi đã có một số rắc rối tương tự như thế này,

<repository>
    <id>java.net</id>
    <url>https://maven-repository.dev.java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>java.net2</id>
    <url>https://maven2-repository.dev.java.net/nonav/repository</url>
</repository>

Đặt updatePolicy thành "không bao giờ" không hoạt động. Loại bỏ những repo này là cách tôi giải quyết nó. ps: Tôi đã theo dõi hướng dẫn này về các dịch vụ web (btw, có lẽ là hướng dẫn tốt nhất cho ws cho java)


1
Bạn đang sử dụng Intellij? Vì Intellij + Maven = bỏ qua updatePolicy. Xem báo cáo lỗi youtrack.jetbrains.com/su/IDEA-76869
Manav
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.