Maven이 매번 maven-metadata.xml을 다운로드하는 이유는 무엇입니까?


116

다음은 Maven으로 웹 애플리케이션을 빌드하려고 할 때 인터넷 연결이 불안정 할 때 일반적으로 발생하는 오류입니다.

내 질문은 왜 Maven이 이전에 동일한 앱을 빌드 할 때마다 항상 다운로드해야한다는 것입니다.

Maven이 매번 다운로드하게 만드는 내 구성에서 무엇이 잘못되었을 수 있습니까?

다음은 오프라인으로 빌드하려고 할 때 발생하는 오류입니다.

[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
Maven에 새로 생성 된 SNAPSHOT 등에 대한 정보를 얻기 위해 SNAPSHOT이 필요한 경우 메타 데이터에 액세스합니다.
khmarbaise

7
이유는 모르겠지만 -o 옵션을 사용하여 피할 수 있습니다mvn clean install -o
ant

실제로 빌드가 실패하는 오류는 "WAR 어셈블 링 오류 : webxml 속성이 필요합니다 (또는 업데이트 모드에서 실행하는 경우 기존 WEB-INF / web.xml)"입니다. 그래서 당신은 그것을 고쳐야합니다. 인터넷 연결과 관련이 있다고 생각할 수 없습니다. 종속성 해결 경고는 경고입니다. 빌드 실패의 궁극적 인 원인은 아닙니다.
Frans

두 가지 질문이있는 것 같으므로 질문을 명확히 할 수 있습니다. 1) 빌드가 실패하는 이유는 무엇입니까? 2) Maven이 메타 데이터를 다운로드하려고하는 이유는 무엇입니까? user944849의 답변은 2)에 대한 답변으로갑니다. 이것이 귀하의 질문에 답이된다면 수락해야합니다.
Frans

스냅 샷 메타 데이터 업데이트를 사용하여 방지 할 수 있습니다 -nsu, --no-snapshot-updates옵션mvn
Janaka 다라

답변:


127

요소에 대해 사용자 settings.xml(또는 프로젝트의 상위 또는 회사 상위 POM)를 찾습니다 <repositories>. 아래와 같이 보일 것입니다.

<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>

<updatePolicy>요소에 유의하십시오 . 이 예제는 Maven이 빌드 중에 스냅 샷 아티팩트를 검색해야 할 때마다 Maven에 원격 저장소 (내 경우에는 Nexus, 자체 원격 저장소를 사용하지 않는 경우 Maven Central)에 연락하도록 지시하여 최신 사본이 있는지 확인합니다. 이를 위해 메타 데이터가 필요합니다. 최신 사본이 있으면 Maven이 로컬 저장소로 다운로드합니다.

이 예에서 릴리스의 경우 정책은 daily하루의 첫 번째 빌드 중에 확인하도록되어 있습니다. Maven 설정 문서에never 설명 된대로 유효한 옵션이기도합니다 .

플러그인은 별도로 해결됩니다. 원하는 경우 다른 업데이트 정책을 사용하여 리포지토리를 구성 할 수도 있습니다.

<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>

다른 누군가가 -o옵션을 언급했습니다 . 이를 사용하면 Maven이 "오프라인"모드로 실행됩니다. 로컬 리포지토리 만 있으며 사용하는 업데이트 정책에 관계없이 아티팩트를 새로 고치기 위해 원격 리포지토리에 연결하지 않습니다.


2
질문은 왜 항상 "절대"(내 생각에 그래야한다고 생각하는)가 아닌가? 매일 또는 항상 업데이트가 필요한 이유는 무엇입니까?
레온

@Leon 개발 중반주기 동안 프로젝트에는 항상 최신 빌드 버전을 선택하고 싶을 수있는 '-SNAPSHOT'종속성이있을 수 있습니다. 적어도 CI 시스템에서는 개발자가 선호하는 것이 다를 수 있습니다-거래 빌드 안정성 최신 변경 사항을 가져 오는 것과 비교합니다. maven 문서 (특징적으로, 불행히도)가 명확하게 밝히지 못하는 것은 아무것도 설정되지 않은 경우 기본값입니다.
에드 랜달

1
모범 사례는 한 번 릴리스 된 아티팩트는 절대 변경되지 않으므로 <updatePolicy> 절대 </ updatePolicy>가 적절해야한다는 것입니다.
에드 랜달

그러나 POM 종속성을 새 릴리스로 업데이트하면 어떻게 될까요? 업데이트되지 않습니까?
Philip Rego

1
@PhilipRego-updatePolicy는 아티팩트별로 적용됩니다. 버전 번호 또는 그룹 / 아티팩트 ID를 변경하면 이는 다른 아티팩트입니다. updatePolicy가 'never'이면 새로 고침이 강제 실행 -U되거나 로컬 리포지토리에서 아티팩트가 제거되어 다시 다운로드해야하는 경우를 제외하고 아티팩트가 한 번 다운로드됩니다.
user944849

31

-o,--offline "Work offline"이를 방지하기 위해 플래그를 사용할 수 있습니다 .

이렇게 :

maven compile -o


인터넷 연결이 불안정 할 때 간단히이 명령을 호출 할 수 있기 때문에 이것이 정답이라고 생각합니다. 그리고 이것이 요청 된 것입니다 ...
그래서 S

13

플러그인 버전을 지정하지 않았기 때문에 마지막 버전을 얻기 위해 관련 메타 데이터의 다운로드를 트리거한다고 생각합니다.

그렇지 않으면 -o를 사용하여 로컬 리포지토리 사용을 강제하려고 했습니까?


그렇다면 플러그인 버전을 어떻게 지정합니까? POM에 버전이 설정되어 있다고 확신합니다 ... 좀 더 구체적으로 말씀해 주시겠습니까?
쿼크

당신은이 잘 경우 version내부 요소 plugin요소를 너무 생각 밖으로 i'am 경우 ... 행운을 빌어 요 당신은 실제로 그것을 구성한

제 경우에는 버전이 범위 [12.1 12.2)이고 메타 데이터 캐시가 24 시간으로 설정되었으므로 매일 첫 번째 빌드에서 최신 버전을 확인합니다
mzzzzb 2014 년

기본 플러그인은 어떻습니까? maven-surefire-common내가 지정하지 않은 과 같은 ?
yegeniy

그들의 버전은 주어진 maven 릴리스에 대해 수정되었지만 pluginManagement섹션을 사용하여 다른 버전을 강제 할 수 있습니다
Gab

0

Maven이 어떤 조회를 할 때 아직 연구하지 않았지만 안정적이고 재현 가능한 빌드를 얻으려면 Maven Respositories에 직접 액세스하지 말고 Nexus와 같은 Maven Repository Manager를 사용하는 것이 좋습니다.

설정 파일을 설정하는 방법은 다음과 같습니다.

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

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


@acdcjunior 내가 말했듯이 아직 공부하지 않았습니다. 그러나 로컬 Maven 리포지토리 관리자를 사용하면 이러한 문제 대부분도 해결할 수 있습니다 (Maven이 메타 데이터를 확인하는 경우 Maven 리포지토리 관리자에만 액세스합니다)
Puce

1
IMHO repo 관리자는 중복 다운로드를 방지하고 특히이 조직에 특정한 아티팩트 (예 : 상위 poms 및 내부 모듈)를 배포하기 위해 조직 내부에서만 유용합니다. 그렇지 않으면 이미 로컬 미러가 있으므로 추가 미러를 추가하는 이유는 무엇입니까?
Gab

@Puce 나는 그것이 문제를 어떻게 해결할지 모르겠습니다. maven이 네트워크에서 메타 데이터를 전혀 확인하지 않도록하려면 인터넷에서 확인하는지 인트라넷 저장소 관리자에서 확인하는지는 중요하지 않습니다.
eis

@eis "인터넷 연결이 비정상적"이거나 현재 저장소 서버 중 하나를 사용할 수없는 경우에 도움이 될 것입니다. LAN에서 Maven 저장소 관리자에만 액세스하고 있기 때문입니다.
Puce 2013 년

@Gap repo 관리자는 당신이 언급 한 이유로 조직에서 특히 유용하지만, repo 관리자는 안정적이고 재현 가능한 빌드를 얻는데도 중요합니다. 이는 현재 프로젝트의 유일한 개발자 인 경우에도 일반적으로 목표하는 것입니다. 로컬 리포지토리를 지울 수 있고 모든 빌드를 재현 할 수 있으며 다른 개발자가 프로젝트에 쉽게 참여할 수 있음을 보장합니다. 나는 때때로 로컬로 실행되는 Jenkins와 함께 이것을 확신하고, 또한 repo 관리자에 액세스하고 또한 내 프로젝트를 릴리스하는 데 도움을줍니다-> repo 관리자에 액세스하는 2 명의 사용자 : Jenkins and myself
Puce

0

Maven은 종속성이 SNAPSHOT 버전에 있고 maven은 저장소의 해당 스냅 샷 버전에 대한 변경 사항을 감지 할 방법이 없기 때문에이를 수행합니다. 아티팩트를 릴리스하고 pom.xml의 버전을 해당 버전으로 변경하면 maven이 더 이상 메타 데이터 파일을 가져 오지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.