2016-10-03 3 views
3

죄송 다른 저장소에서이 개 동일 단지를 다운로드 할 때 사용하는 .JAR 선택할 않는 방법 :메이븐은 긴 설명

배경 : 나는이 개 프로젝트가,의는 A와 B가 프로젝트 (A)에 구축 가정 해 봅시다 Nexus Repository Manager OSS 2.12.0 repo A에 배포하고 Nexus Repo B에 Project B를 배포합니다. 내 프로젝트는 repo A와 repo B에서 .jars를 사용해야합니다.

따라서 Maven을 구성했습니다. 두 개의 서로 다른 Nexus 저장소 (2 개의 미러 사용)를 사용하기위한 설정 파일.

이제 메이븐 프로젝트를 컴파일하면 repo A를 통해 항아리를 검색 한 다음 repo B를 통해 항아리를 검색합니다. 항아리를 발견하면 다운로드 할 것입니다.

문제 : 저는 Repo B를 프로젝트 A와 프로젝트 B의 jar에 사용했습니다 (나는 repo의 소유자가 나를 내쫓 았습니다). 따라서 이제는 Repo A와 repo B 모두에서 동일한 0.0.1-SNAPSHOT을 갖게되었습니다.

Maven은 컴파일하는 동안 두 스냅 샷을 모두 다운로드합니다.

질문 : 둘 다 동일한 이름 (예 : componentName-0.0.1-SNAPSHOT) 인 경우 사용할 .jar를 어떻게 확인합니까? 내 로컬 ./m2 저장소에는 resolver-status 파일이 있지만 두 항아리간에 어떻게 해결되는지는 잘 모르겠습니다. 이상적으로, maven이 가장 최근에 업데이트 된 (timestamp에 기반한) jar를 사용하기를 원할 것입니다.

+0

당신은 단지를 선택하는 기본 수단으로 개정 타임 스탬프를 사용하지 않아야합니다; 대신 버전 번호를 사용하십시오. – hexafraction

+0

버전을 조금만 늘리면됩니다. 'componentName-0.0.2-SNAPSHOT' – Taylor

+0

가능한 복수의 [ 구성을 어떻게 처리합니까?] (http://stackoverflow.com/questions/34238196/how-maven-handle-multiple-repository-configurations) –

답변

3

짧은 대답 : 어느 것이 든 저장소가 maven에 의해 계산 된 유효 POM 중 첫 번째 것입니다. (당신은 mvn help:effective-pom를 실행하여 효과적인 치어를 볼 수 있습니다.)

긴 대답 :

이 (약)으로는 다음과 받는다는 스냅 샷 아티팩트를 해결하는 방법은 다음과 같습니다

1)가 각각의 종속을 통해 이동 각 S 들어 <snapshotRepositories>

3에 나열된 모든 저장소 통해 <dependencies>

2)에 걸어 SNAPSHOT 버전) NAPSHOT 저장소에서 해당 종속성 그룹, 패키지 이름 및 버전에 대해 maven-metadata.xml 파일이 있는지 확인하십시오.

예를 들어, 패키지 좌표가 io.packagecloud:jake:4.0-SNAPSHOT 인 경우 구성된 각 저장소에서 /io/packagecloud/jake/4.0-SNAPSHOT/maven-metadata.xml을 찾습니다.

4)이 파일이 발견되면이 파일을 사용하여 dwonload 할 최신 아티팩트를 찾으십시오. 예를 들어 maven-metadata.xml에서 살펴보면 :

$ curl -L https://packagecloud.io/capotej/snapshot_example/maven2/io/packagecloud/jake/4.0-SNAPSHOT/maven-metadata.xml 

<?xml version="1.0" encoding="UTF-8"?> 
<metadata modelVersion="1.1.0"> 
    <groupId>io.packagecloud</groupId> 
    <artifactId>jake</artifactId> 
    <version>4.0-SNAPSHOT</version> 
    <versioning> 
    <snapshot> 
     <timestamp>20161003.234325</timestamp> 
     <buildNumber>2</buildNumber> 
    </snapshot> 
    <lastUpdated>20161003234325</lastUpdated> 
    <snapshotVersions> 
     <snapshotVersion> 
     <extension>jar</extension> 
     <value>4.0-20161003.234325-2</value> 
     <updated>20161003234325</updated> 
     </snapshotVersion> 
     <snapshotVersion> 
     <extension>pom</extension> 
     <value>4.0-20161003.234325-2</value> 
     <updated>20161003234325</updated> 
     </snapshotVersion> 
    </snapshotVersions> 
    </versioning> 
</metadata> 

우리는 <lastUpdated> 타임 스탬프 20161003234325 것을 볼 수 있습니다. 이 타임 스탬프를 사용하여 <snapshotVersions>에서 전체 값을 검색 할 수 있습니다.이 경우에는 4.0-20161003.234325-2입니다.

5) 지금 받는다는는이 스냅 샷의 전체 고유 버전을 알고, 그것은 저장소에서 다운로드 할 수 있습니다 :

curl -I https://packagecloud.io/capotej/snapshot_example/maven2/io/packagecloud/jake/4.0-SNAPSHOT/jake-4.0-20161003.234325-2.jar 

희망이 귀하의 질문에 대답!

관련 :

Maven repository support

SBT SNAPSHOT Deploys and fatjar Support

+0

동일한 항아리가 포함 된 1 개의 호스팅 된 프록시 리포지토리와 2 개의 프록시 리포지토리가 Nexus에서 말한 경우에도 동일하게 적용됩니까? 프록시 A가 프록시 B와 Hosted repos보다 최신 인 라이브러리 X에 lastUpdated 스탬프를 가지고있는 경우 선택됩니까? – f1dave