What This Error Means
Maven could not download or parse the POM for a dependency/plugin, so it cannot resolve that artifact's transitive dependencies.
How to Fix It
- Read the innermost cause in the Maven output to see whether this is
not found,unauthorized, TLS, or a network transfer failure. - If the POM is missing, fix the publication upstream (re-publish the artifact with its POM) or correct the coordinates in your
pom.xml. - If the POM should be in a private repository, add/configure that repository (prefer a mirror in
settings.xml) and ensure credentials are set under<servers>. - If the error was cached, force updates once:
mvn -U -DskipTests package. - Delete the affected artifact directory (or just
*.lastUpdated) under~/.m2/repository/<groupId path>/<artifactId>/, then retry the build. - If the failure is network/proxy/TLS related, fix connectivity first, then rerun the original Maven command.
Why It Happens
- The repository is unreachable (DNS, firewall, proxy, VPN, outage).
- The repository requires authentication (401/403) but Maven is not sending valid credentials.
- The artifact exists, but its POM was never published (broken/partial release) or the coordinates are wrong.
- A cached failed download (
*.lastUpdated) is preventing Maven from retrying immediately.
How to Verify
- Re-run the original Maven goal and confirm the
Failed to read artifact descriptorline is gone. - Run
mvn -q -DskipTests dependency:treeand confirm Maven can resolve the previously failing artifact.
Manual descriptor download checks
- Copy the failing coordinates from the error and fetch the POM directly (replace coordinates):
mvn -q -Dartifact=groupId:artifactId:pom:version dependency:get. - Print effective settings (mirrors/proxies/servers):
mvn -q help:effective-settings. - Force a re-check of remote metadata once:
mvn -U -DskipTests package. - If you suspect caching, delete
*.lastUpdatedfiles under the affected artifact directory in~/.m2/repository/and retry.
Common CLI Output
[ERROR] Failed to read artifact descriptor for org.example:lib:jar:1.2.3: Could not transfer artifact org.example:lib:pom:1.2.3 from/to central (https://repo.maven.apache.org/maven2): transfer failed for https://repo.maven.apache.org/maven2/org/example/lib/1.2.3/lib-1.2.3.pom[ERROR] Failed to read artifact descriptor for org.example:lib:jar:1.2.3: Could not find artifact org.example:lib:pom:1.2.3 in central (https://repo.maven.apache.org/maven2) What an artifact descriptor is
- For most artifacts, the "descriptor" is the artifact's POM file.
- Maven needs the POM to determine packaging, dependencies, dependencyManagement, relocations, and repository metadata.
- If the POM cannot be downloaded (network/auth/TLS) or does not exist, Maven cannot continue resolving the graph.
Prevention Tips
- Publish artifacts through a repository manager that enforces complete metadata (POM + checksums).
- Use a single mirror/proxy repository to reduce environment-specific repository differences.
- Avoid deleting the entire
~/.m2cache, prefer targeted cleanup of the broken artifact directory.
Where This Can Be Triggered
github.com/apache/maven/blob/maven-3.9.6/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
When dependency collection fails, Maven rethrows a DependencyResolutionException that includes the underlying resolver exception message (often containing "Failed to read artifact descriptor for ..."). - GitHub
String msg = "Could not resolve dependencies for project " + project.getId() + ": " + e.getMessage();
DependencyResolutionException dex = new DependencyResolutionException(msg, e);
dex.setResult(e.getResult());
throw dex;