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. 마무리
이 문제는 폐쇄망 환경의 시간 순서 문제다.
- 빌드 에이전트가 빌드 시도 → 실패 → .lastUpdated 생성
- 해당 아티팩트를 Nexus에 업로드
- 다시 빌드 시도 → Maven이 .lastUpdated를 보고 캐시된 실패로 판단 → 또 실패
-U를 주면 Maven이 캐시를 무시하고 Nexus를 직접 조회하므로 이 순환 고리를 끊을 수 있다.
빌드 #4: clean package -DskipTests -U → 성공 🎉
폐쇄망에서 Nexus에 파일을 올린 후에도 빌드가 실패한다면 .lastUpdated 캐시를 먼저 의심한다. -U 하나로 해결된다.
'Java > Maven' 카테고리의 다른 글
| [Troubleshooting] Maven parent POM이 Nexus에 없어서 빌드 실패 — mvn dependency:list의 함정 (0) | 2026.06.03 |
|---|---|
| [폐쇄망 CI/CD] Maven 의존성을 Nexus에 자동 업로드하기 (0) | 2026.06.03 |
| [Troubleshooting] Spring Boot 2.3 + JEUS 로그 라이브러리 충돌 해결 (0) | 2026.05.05 |
| [Maven] 외부망에서 .m2 복사했는데 내부망 빌드 실패할 때 (0) | 2026.05.05 |
| [Maven] clean / package / --offline / -U 실무 정리 (0) | 2026.05.05 |