in compat/maven-compat/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java [153:286]
public ResolutionGroup retrieve(MetadataResolutionRequest request) throws ArtifactMetadataRetrievalException {
Artifact artifact = request.getArtifact();
//
// If we have a system scoped artifact, then we do not want any searching in local or remote repositories,
// and we want artifact resolution to only return the system scoped artifact itself.
//
if (artifact.getScope() != null && artifact.getScope().equals(Artifact.SCOPE_SYSTEM)) {
return new ResolutionGroup(null, null, null);
}
ResolutionGroup cached = cache.get(
artifact,
request.isResolveManagedVersions(),
request.getLocalRepository(),
request.getRemoteRepositories());
if (cached != null
// if the POM has no file, we cached a missing artifact, only return the cached data if no update forced
&& (!request.isForceUpdate() || hasFile(cached.getPomArtifact()))) {
return cached;
}
List<Dependency> dependencies;
List<Dependency> managedDependencies = null;
List<ArtifactRepository> pomRepositories = null;
Artifact pomArtifact;
Artifact relocatedArtifact = null;
// TODO hack: don't rebuild model if it was already loaded during reactor resolution
RepositorySystemSession repositorySession = legacySupport.getRepositorySession();
final WorkspaceReader workspace = repositorySession.getWorkspaceReader();
Model model;
if (workspace instanceof MavenWorkspaceReader mavenWorkspaceReader) {
model = mavenWorkspaceReader.findModel(RepositoryUtils.toArtifact(artifact));
} else {
model = null;
}
if (model != null) {
pomArtifact = artifact;
dependencies = model.getDependencies();
DependencyManagement dependencyManagement = model.getDependencyManagement();
managedDependencies = dependencyManagement == null ? null : dependencyManagement.getDependencies();
MavenSession session = legacySupport.getSession();
if (session != null) {
if (session.getProjects() != null) {
pomRepositories = session.getProjects().stream()
.filter(p -> artifact.equals(p.getArtifact()))
.map(MavenProject::getRemoteArtifactRepositories)
.findFirst()
.orElseGet(() -> getRepositoriesFromModel(repositorySession, model));
} else {
pomRepositories = getRepositoriesFromModel(repositorySession, model);
}
} else {
pomRepositories = new ArrayList<>();
}
} else if (artifact instanceof ArtifactWithDependencies artifactWithDependencies) {
pomArtifact = artifact;
dependencies = artifactWithDependencies.getDependencies();
managedDependencies = artifactWithDependencies.getManagedDependencies();
} else {
ProjectRelocation rel = retrieveRelocatedProject(artifact, request);
if (rel == null) {
return null;
}
pomArtifact = rel.pomArtifact;
relocatedArtifact = rel.relocatedArtifact;
if (rel.project == null) {
// When this happens we have a Maven 1.x POM, or some invalid POM.
// It should have never found its way into Maven 2.x repository, but it did.
dependencies = Collections.emptyList();
} else {
dependencies = rel.project.getModel().getDependencies();
DependencyManagement depMgmt = rel.project.getModel().getDependencyManagement();
managedDependencies = (depMgmt != null) ? depMgmt.getDependencies() : null;
pomRepositories = rel.project.getRemoteArtifactRepositories();
}
}
Set<Artifact> artifacts = Collections.emptySet();
if (!artifact.getArtifactHandler().isIncludesDependencies()) {
artifacts = new LinkedHashSet<>();
for (Dependency dependency : dependencies) {
Artifact dependencyArtifact = createDependencyArtifact(dependency, artifact, pomArtifact);
if (dependencyArtifact != null) {
artifacts.add(dependencyArtifact);
}
}
}
Map<String, Artifact> managedVersions = null;
if (managedDependencies != null && request.isResolveManagedVersions()) {
managedVersions = new HashMap<>();
for (Dependency managedDependency : managedDependencies) {
Artifact managedArtifact = createDependencyArtifact(managedDependency, null, pomArtifact);
managedVersions.put(managedDependency.getManagementKey(), managedArtifact);
}
}
List<ArtifactRepository> aggregatedRepositories =
aggregateRepositories(request.getRemoteRepositories(), pomRepositories);
ResolutionGroup result =
new ResolutionGroup(pomArtifact, relocatedArtifact, artifacts, managedVersions, aggregatedRepositories);
cache.put(
artifact,
request.isResolveManagedVersions(),
request.getLocalRepository(),
request.getRemoteRepositories(),
result);
return result;
}