Tại sao Maven luôn tải xuống maven-metadata.xml?


116

Dưới đây là lỗi tôi thường gặp khi kết nối internet của tôi bị ngắt khi cố gắng tạo ứng dụng web với maven.

Câu hỏi của tôi là, tại sao maven luôn phải tải xuống mọi lúc khi cùng một ứng dụng đã được xây dựng trước đó.

Điều gì có thể sai trong cấu hình của tôi khiến maven phải tải xuống mọi lúc?

Dưới đây là lỗi tôi gặp phải khi cố gắng tạo ngoại tuyến:

[INFO] ------------------------------------------------------------------------
[INFO] Building mywebapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://raw.github.com/pagecrumb/mungo/mvn-repo/com/pagecrumb/mungo/0.0.1-SNAPSHOT/maven-metadata.xml

[WARNING] Could not transfer metadata com.mywebapp:mungo:0.0.1-SNAPSHOT/maven-metadata.xml 
from/to mungo-mvn-repo (https://raw.github.com/pagecrumb/mungo/mvn-repo/): raw.github.com
[INFO] 
[INFO] --- maven-war-plugin:2.1.1:war (default-cli) @ mywebapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp] in [D:\workspace\web\target\mywebapp-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\workspace\web\src\main\webapp]
[INFO] Webapp assembled in [1237 msecs]
[INFO] Building war: D:\workspace\web\target\mywebapp-1.0-SNAPSHOT.war
[WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored 
(webxml attribute is missing from war task, 
or ignoreWebxml attribute is specified as 'true')
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building com.mywebapp [com.mywebapp] 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.1/maven-release-plugin-2.1.pom

[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-release-plugin:2.1: Plugin org.apache.maven.plugins:maven-release-plugin:2.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-release-plugin:jar:2.1
Downloading: http://download.java.net/maven/2/org/apache/maven/plugins/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml

397/397 B   

Downloaded: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml (397 B at 0.0 KB/sec)
[WARNING] Failure to transfer org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from http://download.java.net/maven/2 was cached in the local repository, resolution will not be reattempted until the update interval of maven2-repository.dev.java.net has elapsed or updates are forced. Original error: Could not transfer metadata org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from/to maven2-repository.dev.java.net (http://download.java.net/maven/2): download.java.net
[INFO] 
[INFO] --- maven-war-plugin:2.3:war (default-cli) @ mywebapp-build ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp-build] in [D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [15 msecs]
[INFO] Building war: D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] mywebapp ..................................... SUCCESS [27.999s]
[INFO] com.mywebapp [com.mywebapp] ..................... FAILURE [1:00.406s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:41.409s
[INFO] Finished at: Tue May 07 22:13:38 SGT 2013
[INFO] Final Memory: 11M/28M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war 
(default-cli) on project mywebapp-build: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

2
Quyền truy cập vào siêu dữ liệu trong trường hợp cần thiết của SNAPSHOT để Maven thông báo về SNAPSHOT's mới được tạo, v.v.
khmarbaise

7
Tôi không biết tại sao nhưng bạn có thể tránh điều này bằng cách sử dụng tùy chọn như -omvn clean install -o
ant

Trên thực tế, lỗi mà bản dựng không thành công là "Lỗi khi lắp ráp thuộc tính WAR: webxml là bắt buộc (hoặc WEB-INF / web.xml tồn tại trước nếu thực thi ở chế độ cập nhật)". Vì vậy, bạn nên sửa chữa điều đó. Tôi không thể hình dung nó có liên quan đến kết nối internet của bạn. Các cảnh báo giải quyết phụ thuộc chỉ là: cảnh báo. Chúng không phải là nguyên nhân cuối cùng gây ra lỗi xây dựng của bạn.
Frans

Có lẽ bạn có thể làm rõ câu hỏi của mình vì bạn dường như có hai câu hỏi: 1) Tại sao công trình của tôi bị lỗi? 2) Tại sao maven cố gắng tải xuống siêu dữ liệu? câu trả lời của user944849 đi một chặng đường dài để trả lời 2). Nếu điều đó trả lời câu hỏi của bạn, bạn nên chấp nhận nó.
Frans

Ảnh chụp siêu dữ liệu cập nhật có thể tránh được sử dụng -nsu, --no-snapshot-updatestùy chọn vớimvn
Janaka Bandara

Câu trả lời:


127

Tìm trong settings.xml(hoặc, có thể là POM mẹ của dự án hoặc công ty mẹ của bạn) để tìm <repositories>phần tử. Nó sẽ giống như bên dưới.

<repositories>
    <repository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
    </repository>
</repositories>

Lưu ý <updatePolicy>phần tử. Ví dụ này yêu cầu Maven liên hệ với kho lưu trữ từ xa (trong trường hợp của tôi là Nexus, Maven Central nếu bạn không sử dụng kho lưu trữ từ xa của riêng mình) bất cứ lúc nào Maven cần truy xuất phần mềm ảnh chụp nhanh trong quá trình xây dựng, kiểm tra xem có bản sao mới hơn không. Siêu dữ liệu là bắt buộc cho việc này. Nếu có một bản sao mới hơn, Maven tải nó xuống repo cục bộ của bạn.

Trong ví dụ, đối với các bản phát hành, chính sách này dailysẽ được kiểm tra trong lần xây dựng đầu tiên trong ngày của bạn. nevercũng là một tùy chọn hợp lệ, như được mô tả trong tài liệu cài đặt Maven .

Các plugin được giải quyết riêng. Bạn cũng có thể có các kho lưu trữ được định cấu hình cho những kho lưu trữ đó, với các chính sách cập nhật khác nhau nếu muốn.

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
        </releases>
    </pluginRepository>
</pluginRepositories>

Ai đó đã đề cập đến -otùy chọn này. Nếu bạn sử dụng điều đó, Maven sẽ chạy ở chế độ "ngoại tuyến". Nó biết nó chỉ có một repo cục bộ và nó sẽ không liên hệ với repo từ xa để làm mới các phần mềm bất kể bạn sử dụng chính sách cập nhật nào.


2
Câu hỏi đặt ra là: tại sao nó không phải lúc nào cũng là "không bao giờ" (mà tôi nghĩ nó nên như vậy)? Tại sao bạn cần cập nhật hàng ngày hoặc luôn luôn?
Leon

@Leon Trong thời gian giữa chu kỳ phát triển, dự án của bạn có thể có các phụ thuộc '-SNAPSHOT' mà bạn có thể muốn luôn chọn phiên bản được xây dựng mới nhất - ít nhất, trên hệ thống CI mà bạn có thể thích, một nhà phát triển có thể có tùy chọn khác - tính ổn định của giao dịch so với nhận những thay đổi mới nhất. Điều mà các tài liệu về maven (đặc biệt là không may) không làm rõ là các giá trị mặc định cho các giá trị này nếu không có gì được đặt.
Ed Randall

1
Phương pháp hay nhất là khi đã phát hành thì một cấu phần phần mềm không bao giờ thay đổi, vì vậy <updatePolicy> never </updatePolicy> phải phù hợp với chúng.
Ed Randall

Nhưng điều gì sẽ xảy ra nếu bạn cập nhật các phụ thuộc POM của mình lên một bản phát hành mới? Nó sẽ không bao giờ được cập nhật?
Philip Rego

1
@PhilipRego - chính sách cập nhật áp dụng cho mỗi cấu phần. Nếu bạn thay đổi số phiên bản hoặc ID nhóm / cấu phần phần mềm, thì đó là phần mềm khác. Nếu updatePolicy là 'không bao giờ' thì cấu phần phần mềm sẽ được tải xuống một lần, trừ khi buộc phải làm mới -Uhoặc phần mềm bị xóa khỏi kho lưu trữ cục bộ và do đó cần được tải xuống lại .
user944849

31

Có thể sử dụng cờ -o,--offline "Work offline" để ngăn chặn điều đó.

Như thế này:

maven compile -o


Tôi tin rằng đây phải là câu trả lời chính xác, bởi vì bạn có thể đơn giản gọi lệnh này khi kết nối internet của bạn không ổn định. Và đây là những gì đã được hỏi ...
Vì vậy, S

13

Tôi cho rằng vì bạn không chỉ định phiên bản plugin nên nó kích hoạt tải xuống siêu dữ liệu được liên kết để có được siêu dữ liệu cuối cùng.

Nếu không, bạn đã cố buộc sử dụng repo cục bộ bằng -o chưa?


Vì vậy, làm thế nào để bạn chỉ định phiên bản plugin? Tôi chắc rằng tôi đã đặt phiên bản trong POM ... bạn có thể nói rõ hơn được không?
quarks

tốt nếu bạn có một versionphần tử bên trong pluginphần tử thì bạn đã thực sự định cấu hình nó, nếu vậy thì tôi không có ý tưởng ... Chúc may mắn
Gab

trong trường hợp của tôi phiên bản là một loạt [12,1 12,2) và bộ nhớ cache siêu dữ liệu đã được thiết lập đến 24 giờ vì vậy nó sẽ kiểm tra phiên bản mới hơn tại build đầu tiên mỗi ngày
mzzzzb

Điều gì về các plugin mặc định? chẳng hạn như maven-surefire-common, mà tôi chưa chỉ định?
yegeniy

phiên bản của họ được cố định cho một bản phát hành maven nhất định nhưng bạn có thể buộc một phiên bản khác bằng cách sử dụng pluginManagementphần
Gab

0

Tôi vẫn chưa nghiên cứu về việc Maven sẽ tra cứu khi nào, nhưng để có được các bản dựng ổn định và có thể tái tạo, tôi thực sự khuyên bạn không nên truy cập trực tiếp vào Maven Respositories mà nên sử dụng Maven Repository Manager chẳng hạn như Nexus.

Đây là hướng dẫn cách thiết lập tệp cài đặt của bạn:

http://books.sonatype.com/nexus-book/reference/maven-sect-single-group.html

http://maven.apache.org/repository-management.html


@acdcjunior như tôi đã nói, tôi chưa nghiên cứu điều đó. Nhưng việc sử dụng Trình quản lý kho lưu trữ Maven cục bộ cũng sẽ giải quyết được hầu hết các vấn đề này (nếu Maven kiểm tra siêu dữ liệu, nó sẽ chỉ truy cập Trình quản lý kho lưu trữ Maven của bạn)
Puce

1
IMHO một trình quản lý kho chỉ hữu ích trong một tổ chức để tránh tải xuống dư thừa và đặc biệt để triển khai các tạo tác cụ thể cho tổ chức này (như pom gốc và mô-đun nội bộ). Nếu không, tại sao phải thêm một gương bổ sung vì bạn đã có một gương cục bộ?
Gab

@Puce Tôi không hiểu cách đó sẽ giải quyết vấn đề như thế nào. Nếu bạn không muốn maven kiểm tra siêu dữ liệu trên toàn mạng, nó sẽ không thành vấn đề nếu nó kiểm tra từ internet hoặc từ trình quản lý repo mạng nội bộ.
eis

@eis nó sẽ hữu ích nếu "kết nối internet không hoạt động" hoặc nếu một trong các máy chủ kho lưu trữ hiện không khả dụng, vì bạn chỉ đang truy cập trình quản lý kho lưu trữ maven trong mạng LAN của mình.
Puce

@Gap trong khi người quản lý repo đặc biệt hữu ích trong một tổ chức vì những lý do bạn đã đề cập, người quản lý repo cũng rất quan trọng để có được các bản dựng ổn định và có thể tái tạo, đó là điều tôi thường hướng tới ngay cả khi tôi hiện là nhà phát triển duy nhất của dự án. Nó đảm bảo rằng tôi có thể xóa repo cục bộ của mình và vẫn có thể tái tạo tất cả các bản dựng và các nhà phát triển khác có thể dễ dàng tham gia dự án. Tôi đảm bảo điều này với Jenkins, đôi khi cũng chạy cục bộ, truy cập trình quản lý repo và cũng giúp phát hành các dự án của tôi -> 2 người dùng truy cập trình quản lý repo: Jenkins và tôi
Puce

0

Maven thực hiện điều này vì phần phụ thuộc của bạn nằm trong phiên bản SNAPSHOT và maven không có cách nào để phát hiện bất kỳ thay đổi nào được thực hiện đối với phiên bản ảnh chụp nhanh đó trong kho lưu trữ. Giải phóng cấu phần phần mềm của bạn và thay đổi phiên bản trong pom.xml thành phiên bản đó và maven sẽ không tìm nạp tệp siêu dữ liệu nữa.

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.