본문 바로가기

트러블슈팅

Maven 빌드로 배포 시, 로컬 Repository의 의존성 캐싱 문제로 Build Failure 된 문제 (-U 옵션)

문제

서버에 Maven으로 Project를 배포하는 데 아래와 같은 이유로 Build Failure이 일어났다.

이 날 Project에서 다운 받을 라이브러리가 먼저 배포되었고, 그 다음에 Project를 배포하였다. 그런데 Project 배포할 때 문제가 생겼다.

     [exec] [ERROR] Failed to execute goal on project [프로젝트이름]: 
     Could not resolve dependencies for project [프로젝트 이름]:jar:[버전]: 
     Failure to find [다운받을 라이브러리]:jar:[라이브러리 버전] in 
     https://[원격 Repostiory 도메인]/repositories/releases/ was cached in the local repository, 
     resolution will not be reattempted until the update interval of release has elapsed or updates are forced -> [Help 1]

 

에러난 부분을 해석해보았다.

  • Could not resolve dependencies for project [프로젝트 이름]:jar:[버전]
    -> 배포하려는 [프로젝트 이름]:jar:[버전] 의 의존성을 해결 수 없습니다.
  • Failure to find [다운받을 라이브러리]:jar:[라이브러리 버전] in https://[원격 Repostiory 도메인]/repositories/releases/ was cached in the local repository.
    -> [다운받을 라이브러리] 를 원격 Repositroy에서 찾는 실패 결과가 로컬 Repository에 캐시되었습니다.
  • resolution will not be reattempted until the update interval of release has elapsed or updates are forced
    -> 릴리즈 업데이트 간격이 경과하거나 업데이트가 강제될 때까지 의존성 해결이 다시 시도되지 않습니다.

원인

원격 Repostiory에 라이브러리가 없는 지 확인해보았으나, 다운받으려고 하는 버전에 해당하는 라이브러리가 잘 있는 것을 확인했다.

 

다시 배포를 시도해보았으나, 모두 실패하였다.

이유는 Maven이 첫 번째 배포 실패했을 때 네트워크 등의 이유로 원격 Repositroy에서 라이브러리를 찾을 수 없었고, 이 실패를 로컬 Repository에 캐시하였다. 그래서 일정 시간 동안 동일한 의존성에 대해 다시 시도하지 않기 때문이다.

 

해결

Maven의 -U 명령어를 이용해 의존성 업데이트를 강제하기로 했다.

 

Maven에서 -U 옵션은 모든 스냅샷과 릴리스 의존성을 원격 Repository 강제로 업데이트한다.

 

-U 옵션은 주로 아래와 같은 경우에 사용된다.

  • 원격 Repositroy에서 의존성을 찾지 못했거나, 로컬 Repositroy 캐시된 의존성이 오래된 경우
    : 이번 배포에서 겪은 문제처럼 'Failed to execute goal on project: Could not resolve dependencies for project..' 가 에러메세지가 나오는 경우이다.
  • 스냅샷 버전(SNAPSHOT)의 최신 변경 사항을 반영해야 할 때
    원격 Repositroy에서 릴리즈 버전이 업데이트된 경우, 이를 반영하기 위해 -U 옵션을 사용할 수 있다.

 

Alpha와 Real이 같은 로컬 Repository를 사용하므로

프로젝트의 build.xml에서 Alpha 서버에 해당하는 부분에서 Maven Build에 -U 옵션을 추가해줬다.

그리고 Alpha 서버에 배포하였다.

 

-U를 사용했으므로 기존 로컬 Repository에 있는 의존성은 무시된다.

그리고 원격 Repository에서 의존성을 새로 검색하여 최신 버전을 다운로드한다.

 

Alpha 서버 배포 후, Real 서버를 배포하니 무사히 라이브러리가 다운받아져서 배포되었다.

 

Build.xml에서 Real 서버에 해당하는 부분에 -U를 추가해도 되었지만, 내 경우 새로운 PR을 올리고 머지하는 과정이 필요해 Alpha 서버를 이용했다.

 

참고 문서

https://stackoverflow.com/questions/4856307/when-maven-says-resolution-will-not-be-reattempted-until-the-update-interval-of