apache/maven · error · UnsupportedOperationException
Not yet implemented
Error message
Not yet implemented
What it means
Thrown by DefaultSession.toArtifactRepository() when the RemoteRepository argument is not a DefaultRemoteRepository. The method converts a consumer-API (org.apache.maven.api) RemoteRepository into the legacy ArtifactRepository, but only the default implementation carries the underlying Eclipse Resolver repository needed for the conversion. Any other implementation of the RemoteRepository interface hits the 'TODO' branch and fails with UnsupportedOperationException.
Solutions
- Only pass RemoteRepository instances obtained from the Session itself (session.getRemoteRepositories(), newResolutionRepository) so they are DefaultRemoteRepository
- If you wrap repositories, unwrap/delegate to the original DefaultRemoteRepository before calling toArtifactRepository
- In tests, construct DefaultRemoteRepository (or use the session factory) instead of mocking the interface
- If you genuinely need a custom RemoteRepository converted, raise it upstream — the branch is an explicit TODO and unimplemented
Example fix
// before RemoteRepository custom = new MyRemoteRepository(...); ArtifactRepository ar = session.toArtifactRepository(custom); // UnsupportedOperationException // after DefaultRemoteRepository dr = (DefaultRemoteRepository) session.getRemoteRepositories().get(0); ArtifactRepository ar = session.toArtifactRepository(dr);
Defensive patterns
Strategy: validation
Validate before calling
// before calling session.toArtifactRepository(r)
if (!(repository instanceof org.apache.maven.internal.impl.DefaultRemoteRepository)) {
throw new IllegalArgumentException("Unsupported RemoteRepository implementation: " + repository.getClass().getName());
} Type guard
boolean isConvertible(org.apache.maven.api.repository.RemoteRepository r) {
return r instanceof org.apache.maven.internal.impl.DefaultRemoteRepository;
} Try / catch
try {
ArtifactRepository ar = session.toArtifactRepository(r);
} catch (UnsupportedOperationException e) {
// fall back: construct the legacy ArtifactRepository via ArtifactRepositoryFactory
} Prevention
- Always source RemoteRepository instances from the Session API rather than implementing the interface yourself
- Wrap-and-delegate: keep the original DefaultRemoteRepository reachable inside custom wrappers
- In tests, build real sessions instead of mocking RemoteRepository
When it happens
Trigger: Calling session.toArtifactRepository(repository) with a hand-written or third-party implementation of org.apache.maven.api.repository.RemoteRepository (e.g., a test stub, a mock, or a wrapper created by a custom repository policy), instead of the DefaultRemoteRepository instances produced by DefaultSession.newResolutionRepository()/repository session factories.
Common situations: Embedding Maven and wrapping RemoteRepository objects to customize releases/snapshots policy; mocking RemoteRepository in unit tests; upgrading a library that previously accepted any implementation and now enforces the concrete type.
Related errors
- A maven session is already associated with the repository…
- Cannot change the artifactId for an attached artifact. It…
- Cannot change the repository information for an attached…
- Cannot find ArtifactRepositoryLayout instance for: " +…
- Cannot find ArtifactRepositoryLayout instance for
AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21).
Data as JSON: /api/errors/0d9c031cba49d5d1.
Report an issue: GitHub.
Appendix: source
Thrown at impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java:240
if (repository instanceof DefaultRemoteRepository defaultRemoteRepository) {
org.eclipse.aether.repository.RemoteRepository rr = defaultRemoteRepository.getRepository();
try {
return mavenRepositorySystem.createRepository(
rr.getUrl(),
rr.getId(),
rr.getPolicy(false).isEnabled(),
rr.getPolicy(false).getUpdatePolicy(),
rr.getPolicy(true).isEnabled(),
rr.getPolicy(true).getUpdatePolicy(),
rr.getPolicy(false).getChecksumPolicy());
} catch (Exception e) {
throw new RuntimeException("Unable to create repository", e);
}
} else {
// TODO
throw new UnsupportedOperationException("Not yet implemented");
}
}
}
View on GitHub (pinned to e4093d4e12)