Java/Maven

[Troubleshooting] Maven "was cached in the local repository" — 폐쇄망 빌드 서버에서 캐시된 실패 처리

범데이 2026. 6. 3. 10:27

parent POM을 Nexus에 올렸는데도 빌드가 또 실패했다. 원인은 Maven이 이전에 실패한 해석 결과를 로컬 캐시에 저장해두고 계속 실패로 처리하고 있었기 때문이었다.

 

 

1. 증상

parent POM을 Nexus에 올리고 다시 빌드를 돌렸는데 또 같은 에러가 떴다.

[ERROR] Failed to execute goal on project my-project:
  Could not resolve dependencies ...
    Failure to find com.github.librepdf:openpdf-parent:pom:1.3.30.jaspersoft.2
    in http://nexus.internal:8081/repository/maven-public/
    was cached in the local repository,
    resolution will not be reattempted until the update interval
    of nexus has elapsed or updates are forced

openpdf-parent는 분명히 Nexus에 올라가 있는데 왜 여전히 실패하는지 이해가 되지 않았다.

 

 

 

2. 원인 — Maven의 네가티브 캐시

Maven은 한 번 원격 레포에서 아티팩트 다운로드에 실패하면, 실패 정보를 로컬 .m2에 캐시한다. 다음 실행 시에는 원격 레포를 다시 조회하지 않고 캐시된 실패를 그대로 사용한다.

 

이 네가티브 마크 파일이 .m2에 남아 있으면 was cached 메시지가 뜨면서 설정된 인터벌이 지나기 전까지 재시도하지 않는다.

C:\Users\<agent>\.m2\repository\com\github\librepdf\openpdf-parent\1.3.30.jaspersoft.2\
    openpdf-parent-1.3.30.jaspersoft.2.pom.lastUpdated  ← 이게 문제

.lastUpdated 파일에는 실패한 시간과 실패한 URL이 담겨 있다. Maven은 이것을 보고 "이미 실패한 거 알아. 인터벌 안 지났으니 다시 안 찾아."라고 판단한다.

 

즉, 빌드 에이전트가 Nexus 업로드 이전 시점에 이미 캐시를 만들어둔 것이 문제였다.

 

 

 

 

3. 해결 — -U 플래그로 강제 업데이트

Maven에 -U (--update-snapshots) 플래그를 추가하면, 캐시된 네가티브 마크를 무시하고 원격 레포를 직접 확인한다. TeamCity Maven Build Step의 Goals-U를 추가했다.

# 변경 전
clean package -DskipTests

# 변경 후
clean package -DskipTests -U

-U는 SNAPSHOT 업데이트와 실패한 해석 캐시 무효화 두 가지를 동시에 수행한다.

 

 

 

4. 주의사항

-U는 빌드마다 원격 레포를 업데이트 확인하므로 빌드 에이전트가 완전한 폐쇄망임을 전제로 한다. 원격 접근이 전혀 안 되는 환경이라면 아래 선택지를 사용할 수 있다.

선택지 방법
.lastUpdated 직접 삭제 Get-ChildItem -Recurse -Filter *.lastUpdated | Remove-Item
.m2 전체 삭제 빌드 에이전트의 캐시를 완전히 초기화 후 재시도
업로드 선행 확인 빌드 시작 전 Nexus에 정상 업로드되었는지 스크립트로 확인

 

 

 

 

5. 마무리

이 문제는 폐쇄망 환경의 시간 순서 문제다.

  1. 빌드 에이전트가 빌드 시도 → 실패 → .lastUpdated 생성
  2. 해당 아티팩트를 Nexus에 업로드
  3. 다시 빌드 시도 → Maven이 .lastUpdated를 보고 캐시된 실패로 판단 → 또 실패

-U를 주면 Maven이 캐시를 무시하고 Nexus를 직접 조회하므로 이 순환 고리를 끊을 수 있다.

빌드 #4: clean package -DskipTests -U  → 성공 🎉

폐쇄망에서 Nexus에 파일을 올린 후에도 빌드가 실패한다면 .lastUpdated 캐시를 먼저 의심한다. -U 하나로 해결된다.

728x90
반응형