Maven이 maven-central-repo의 특정 그룹에서 아티팩트에 대한 업데이트를 확인하지 못하게하려면 어떻게해야합니까?


126

상당히 큰 Maven 프로젝트를 진행하고 있습니다. 아마도 약 70여 개의 개별 아티팩트가있을 것입니다.이 아티팩트는 대략 두 개의 공유 코드 라이브러리와이를 사용하는 10 개의 애플리케이션으로 나뉩니다. 이러한 모든 항목은 네임 스페이스에 com.mycompany.*있습니다.

대부분의 경우 스냅 샷 빌드에 대해 실행됩니다. 따라서 전체 응용 프로그램 빌드를 수행하려면 먼저 라이브러리 프로젝트를 빌드하여 로컬 저장소 (예 :)에 설치합니다 mycompany-libname-2.4-SNAPSHOT.jar.

문제는 내가 응용 프로그램을 빌드 할 때입니다. 어떤 이유로 Maven은 주요 mycompany-*-SNAPSHOT.jar아티팩트 (maven-net-repo 및 java-net-repo)에서 모든 아티팩트 의 업데이트를 확인하려고합니다 . 물론, 그들은 거기에서 찾을 수 없으며 모든 것이 결국 로컬 저장소에 구축 한 버전으로 다시 해결되지만 Maven은 (a) 나쁜 그물처럼 느껴지기 때문에이 작업을 중단하고 싶습니다. 이러한 저장소를 끊임없이 확인하여 (b) 빌드 프로세스에 불필요하고 성가신 네트워크 대기 시간을 추가합니다.

나는이 문제를 해결하기 위해 대부분 오프라인 모드에서 maven을 실행했지만, 때로는 공용 라이브러리에 대한 종속성이 업데이트되기 때문에 이상적이지 않습니다. 그래서 내가 찾고있는 것은 Maven이 특정 리포지토리에서 특정 기준을 충족하는 아티팩트에 대한 업데이트를 확인하지 못하게하는 솔루션입니다.이 경우 Maven이 SNAPSHOT 버전 또는 있던 아티팩트를 무시하면 기쁠 것입니다. com.mycompany네임 스페이스.

답변:


34

updatePolicy 태그가 작동하지 않았습니다. 그러나 Rich Seller는 어쨌든 스냅 샷을 비활성화해야한다고 언급 했으므로 더 자세히 살펴보고 settings.xml에 추가 한 추가 리포지토리가 실제로 문제를 일으키는 것으로 나타났습니다. settings.xml 에서이 저장소에 스냅 샷 섹션을 추가하면 트릭이되었습니다!

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

답변 주셔서 감사합니다. 그것은 궁극적으로 나를 도왔습니다. 리포지토리 중 하나의 스냅 샷 다운로드에 문제가있었습니다. 업데이트 경찰이 없어도 다운로드가 중단되었습니다. 이제 정확히 원하는 스냅 샷이 다운로드되지 않습니다.
wolfroma

163

또한 mavn을 "오프라인 모드"로 설정하여 업데이트를 확인하지 않는 mvn 명령 줄을 사용 -o하거나 사용할 수 있습니다 --offline. 로컬 리포지토리에 아직 의존하지는 않지만 큰 문제는 발생하지 않는다는 경고가 표시됩니다.


8
이것은 maven이 릴리스 된 종속성을 다운로드하지 못하게합니다. 업데이트를 위해 스냅 샷을 확인하지 않고 최신 버전의 릴리스 된 라이브러리를 원할 수 있습니다.
hobgoblin

2
이것은 원래 질문에 대한 답이 아닙니다! 어떻게 그렇게 많은 투표를 할 수 있을까요 ??? OP는 명시 적으로 오프라인 모드에서 maven을 실행하려고 시도했지만 그의 목적에 적합하지는 않습니다!
Honza Zidek

95

이제 Maven에서도 사용할 수있는 것은

mvn goal --no-snapshot-updates

또는 간단히

mvn goal -nsu

3
SBT 사람들 set offline := true이 세션 또는 세션에 착륙하는 경우를 대비 offline := true하여 build.sbt.
opyate

5
또한이 nsu옵션은 v 3.0.3에서 손상되었습니다 ( MNG-5064 참조 ). 이 옵션을 안정적으로 사용하려면 최소 3.0.4 또는 3.0.5 이상으로 업그레이드해야합니다.
Ashutosh Jindal

꽤 최고
AntJavaDev

32

업데이트 : 귀하의 프로젝트가 SNAPSHOT이므로 이것을 시작했을 것입니다. Maven이 각 빌드에 대한 업데이트를 확인하는 것은 SNAPSHOT 의미의 일부입니다. SNAPSHOT은 변동성이 있으며 변경 될 수 있으므로 업데이트를 확인해야합니다. 그러나 Maven super POM은 중앙에서 스냅 샷을 비활성화하도록 구성하므로 Maven은 자신의 pom / settings에서 재정의하지 않는 한 중앙에서 SNAPSHOT에 대한 업데이트를 확인하지 않아야합니다.


중앙 저장소에 미러 를 사용하도록 Maven을 구성 할 수 있습니다 . 이렇게하면 일반적으로 중앙으로가는 모든 요청이 내부 저장소로 리디렉션됩니다.

settings.xml에서 내부 저장소를 중앙 미러로 설정하기 위해 다음과 같은 것을 추가합니다.

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

내부 저장소에 Nexus 와 같은 저장소 관리자를 사용하는 경우 프록시 중앙에 프록시 리포지토리 를 설정할 수 있으므로 일반적으로 중앙으로 이동하는 모든 요청은 프록시 리포지토리 (또는 프록시를 포함 하는 리포지토리 그룹 )로 전송되고 후속 요청은 내부 리포지토리 관리자에 캐시됩니다. 프록시 캐시 시간 초과를 -1로 설정할 수도 있으므로 이미 프록시 리포지토리에있는 중앙 콘텐츠를 요청하지 않습니다.


로컬 리포지토리로만 작업하는 경우보다 기본적인 솔루션 은 중앙 리포지토리 의 updatePolicy 를 "never" 로 설정하는 것입니다. 이는 Maven이 로컬 리포지토리에없는 아티팩트 만 검사한다는 의미입니다. 그런 다음 필요할 때 -U 스위치를 사용하여 Maven이 업데이트를 확인하도록함으로써 명령 줄에서이를 무시할 수 있습니다.

리포지토리 (pom 또는 settings.xml의 프로필)를 다음과 같이 구성합니다.

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

실제로 중앙 리포지토리가 있지만 스냅 샷 빌드를 게시하지는 않았으므로 프록시 / 미러를 사용하여 업데이트 확인에 실패했습니다 .Maven을 얻는 방법을 찾고 있습니다. 이러한 아티팩트에 대한 업데이트를 전혀 확인하지 않습니다.
Tim Gilbert

1
또한 SNAPSHOT의 중앙 저장소에 논리 저장소를 설정하는 것이 좋습니다. 즉, 개발자와 개발자가 공유 할 수 있으며 모두 로컬로 빌드 할 필요는 없습니다. 그런 다음 원격 저장소로 푸시되는 즉시 SNAPSHOT 종속성에 대한 변경 사항을 선택하여 SNAPSHOT의 이점을 최대한 활용할 수 있습니다.
Rich Seller

감사합니다-updatePolicy 플래그는 내가 찾던 것과 정확히 같습니다.
Tim Gilbert

1
또한 Nexus에서는 회사 아티팩트에 대한 요청이 외부로 진행되지 않도록 규칙을 구성 할 수 있습니다.
Brian Fox

여기에있는 XML 스 니펫이 오래되었습니다. updatePolicy요소는 아래에 간다 snapshots또는 releases요소입니다. 참조 : maven.apache.org/settings.html
제프 에반스

5

아주 간단한 :

Super POM 상위 또는 setting.xml에서

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

내 팁이야


0

이와 비슷한 문제가있었습니다.

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

updatePolicy를 "never"로 설정하지 못했습니다. 이 레포를 제거하면 해결되었습니다. 추신 : 웹 서비스에 대한 이 튜토리얼 을 따르고있었습니다 (btw, 아마도 자바를위한 ws를위한 최고의 튜토리얼)


1
Intellij를 사용하고 있습니까? Intellij + Maven = updatePolicy를 무시하기 때문입니다. 버그 리포트를 참조하십시오 youtrack.jetbrains.com/issue/IDEA-76869
Manav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.