apache/maven · warning · RepositoryMetadataResolutionException
Unable to store local copy of metadata: {}
Error message
Unable to store local copy of metadata: {} What it means
Slf4jMavenTransferListener.transferCorrupted fires when the resolver reports a corrupted transfer (checksum mismatch observed during a download). The warning shows the underlying exception message plus the repository id, URL, and resource path; the download itself subsequently fails or is retried according to the repository checksum policy.
Source
Thrown at compat/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java:157
+ " due to an error: " + e.getMessage());
getLogger().debug("Exception", e);
} finally {
updateCheckManager.touch(metadata, repository, file);
}
}
// TODO should this be inside the above check?
// touch file so that this is not checked again until interval has passed
if (file.exists()) {
file.setLastModified(System.currentTimeMillis());
}
}
}
try {
mergeMetadata(metadata, remoteRepositories, localRepo);
} catch (RepositoryMetadataStoreException e) {
throw new RepositoryMetadataResolutionException(
"Unable to store local copy of metadata: " + e.getMessage(), e);
}
}
private Date getLocalCopyLastModified(ArtifactRepository localRepository, RepositoryMetadata metadata) {
String metadataPath = localRepository.pathOfLocalRepositoryMetadata(metadata, localRepository);
File metadataFile = new File(localRepository.getBasedir(), metadataPath);
return metadataFile.isFile() ? new Date(metadataFile.lastModified()) : null;
}
private void mergeMetadata(
RepositoryMetadata metadata,
List<ArtifactRepository> remoteRepositories,
ArtifactRepository localRepository)
throws RepositoryMetadataStoreException {
// TODO currently this is first wins, but really we should take the latest by comparing either the
// snapshot timestamp, or some other timestamp later encoded into the metadata.
// TODO this needs to be repeated here so the merging doesn't interfere with the written metadataView on GitHub (pinned to e4093d4e12)
Solutions
- Delete the partially downloaded artifact directory from the local repository and retry with -U
- Compare checksums manually to see which side is wrong: sha1sum of the local file versus the remote .sha1 fetched with curl
- Switch to a healthy mirror of Central if the repository keeps serving corrupt files
- Set checksumPolicy=fail to turn silent corruption into an explicit build error
Example fix
# before mvn clean install # warns during download: Checksum failed ... from central # after clean=$(find ~/.m2/repository -path '*com/example/artifact/1.0' -type d); rm -rf $clean mvn -U clean install
Defensive patterns
Strategy: retry
Validate before calling
dir=~/.m2/repository/com/example/artifact/1.0 current=$(sha1sum $dir/artifact-1.0.jar 2>/dev/null | cut -d' ' -f1) expected=$(cat $dir/artifact-1.0.jar.sha1 2>/dev/null) [ "$current" = "$expected" ] || rm -rf $dir # force clean re-download
Prevention
- Run CI with checksumPolicy=fail so corruption fails loudly instead of warning
- Remove partially downloaded artifacts before entering offline periods
- Report persistent corruption to the repository administrator
When it happens
Trigger: Checksum verification failure while downloading, surfaced through the default CLI logging (visible when progress output is enabled, hidden by --no-transfer-progress).
Common situations: Mirrors or proxies serving truncated files; local repository holding a partial download; repositories with stale .sha1/.md5 files.
Related errors
- The groupId cannot be empty.
- The type cannot be empty.
- The version cannot be empty.
- Unbounded range: {}
- Ranges overlap: {}
AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21).
Data as JSON: /api/errors/a4ce5ac3c9404667.
Report an issue: GitHub.