You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2022/12/23 09:23:04 UTC

[maven-mvnd] branch master updated: Fix performance problem with mvnd (fixes #758, #760)

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-mvnd.git


The following commit(s) were added to refs/heads/master by this push:
     new 417ed7ec Fix performance problem with mvnd (fixes #758, #760)
417ed7ec is described below

commit 417ed7ec8b71b32837c4f7a907ee540a3adea5f3
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Fri Dec 23 10:22:59 2022 +0100

    Fix performance problem with mvnd (fixes #758, #760)
---
 .../maven/project/CachingProjectBuilder.java       | 965 ---------------------
 .../apache/maven/project/SnapshotModelCache.java   |   9 +
 ...elCache.java => SnapshotModelCacheFactory.java} |  36 +-
 3 files changed, 29 insertions(+), 981 deletions(-)

diff --git a/daemon/src/main/java/org/apache/maven/project/CachingProjectBuilder.java b/daemon/src/main/java/org/apache/maven/project/CachingProjectBuilder.java
deleted file mode 100644
index 80b546e6..00000000
--- a/daemon/src/main/java/org/apache/maven/project/CachingProjectBuilder.java
+++ /dev/null
@@ -1,965 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.project;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.InvalidArtifactRTException;
-import org.apache.maven.artifact.InvalidRepositoryException;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager;
-import org.apache.maven.bridge.MavenRepositorySystem;
-import org.apache.maven.feature.Features;
-import org.apache.maven.model.Build;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.DependencyManagement;
-import org.apache.maven.model.DeploymentRepository;
-import org.apache.maven.model.Extension;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Plugin;
-import org.apache.maven.model.Profile;
-import org.apache.maven.model.ReportPlugin;
-import org.apache.maven.model.building.ArtifactModelSource;
-import org.apache.maven.model.building.DefaultModelBuildingRequest;
-import org.apache.maven.model.building.DefaultModelProblem;
-import org.apache.maven.model.building.FileModelSource;
-import org.apache.maven.model.building.ModelBuilder;
-import org.apache.maven.model.building.ModelBuildingException;
-import org.apache.maven.model.building.ModelBuildingRequest;
-import org.apache.maven.model.building.ModelBuildingResult;
-import org.apache.maven.model.building.ModelCache;
-import org.apache.maven.model.building.ModelProblem;
-import org.apache.maven.model.building.ModelProcessor;
-import org.apache.maven.model.building.ModelSource;
-import org.apache.maven.model.building.StringModelSource;
-import org.apache.maven.model.building.TransformerContext;
-import org.apache.maven.model.building.TransformerContextBuilder;
-import org.apache.maven.model.resolution.ModelResolver;
-import org.apache.maven.repository.internal.ArtifactDescriptorUtils;
-import org.apache.maven.repository.internal.DefaultModelCache;
-import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.util.Os;
-import org.codehaus.plexus.util.StringUtils;
-import org.eclipse.aether.DefaultRepositorySystemSession;
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.RequestTrace;
-import org.eclipse.aether.impl.RemoteRepositoryManager;
-import org.eclipse.aether.repository.LocalRepositoryManager;
-import org.eclipse.aether.repository.RemoteRepository;
-import org.eclipse.aether.repository.WorkspaceRepository;
-import org.eclipse.aether.resolution.ArtifactRequest;
-import org.eclipse.aether.resolution.ArtifactResult;
-import org.eclipse.sisu.Priority;
-
-/**
- * CachingProjectBuilder
- */
-@Named
-@Singleton
-@Priority(10)
-public class CachingProjectBuilder implements ProjectBuilder {
-
-    @Inject
-    private Logger logger;
-
-    @Inject
-    private ModelBuilder modelBuilder;
-
-    @Inject
-    private ModelProcessor modelProcessor;
-
-    @Inject
-    private ProjectBuildingHelper projectBuildingHelper;
-
-    @Inject
-    private MavenRepositorySystem repositorySystem;
-
-    @Inject
-    private org.eclipse.aether.RepositorySystem repoSystem;
-
-    @Inject
-    private RemoteRepositoryManager repositoryManager;
-
-    @Inject
-    private ProjectDependenciesResolver dependencyResolver;
-
-    private final ModelCache modelCache = DefaultModelCache.newInstance(new DefaultRepositorySystemSession());
-
-    // ----------------------------------------------------------------------
-    // MavenProjectBuilder Implementation
-    // ----------------------------------------------------------------------
-
-    @Override
-    public ProjectBuildingResult build(File pomFile, ProjectBuildingRequest request) throws ProjectBuildingException {
-        return build(pomFile, new FileModelSource(pomFile), new InternalConfig(request, null, null));
-    }
-
-    @Override
-    public ProjectBuildingResult build(ModelSource modelSource, ProjectBuildingRequest request)
-            throws ProjectBuildingException {
-        return build(null, modelSource, new InternalConfig(request, null, null));
-    }
-
-    private ProjectBuildingResult build(File pomFile, ModelSource modelSource, InternalConfig config)
-            throws ProjectBuildingException {
-        ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
-
-        try {
-            ProjectBuildingRequest projectBuildingRequest = config.request;
-
-            MavenProject project = projectBuildingRequest.getProject();
-
-            List<ModelProblem> modelProblems = null;
-            Throwable error = null;
-
-            if (project == null) {
-                ModelBuildingRequest request = getModelBuildingRequest(config);
-
-                project = new MavenProject();
-                project.setFile(pomFile);
-
-                DefaultModelBuildingListener listener =
-                        new DefaultModelBuildingListener(project, projectBuildingHelper, projectBuildingRequest);
-                request.setModelBuildingListener(listener);
-
-                request.setPomFile(pomFile);
-                request.setModelSource(modelSource);
-                request.setLocationTracking(true);
-
-                ModelBuildingResult result;
-                try {
-                    result = modelBuilder.build(request);
-                } catch (ModelBuildingException e) {
-                    result = e.getResult();
-                    if (result == null || result.getEffectiveModel() == null) {
-                        throw new ProjectBuildingException(e.getModelId(), e.getMessage(), pomFile, e);
-                    }
-                    // validation error, continue project building and delay failing to help IDEs
-                    error = e;
-                }
-
-                modelProblems = result.getProblems();
-
-                initProject(project, Collections.emptyMap(), true, result, new HashMap<>(), projectBuildingRequest);
-            } else if (projectBuildingRequest.isResolveDependencies()) {
-                projectBuildingHelper.selectProjectRealm(project);
-            }
-
-            DependencyResolutionResult resolutionResult = null;
-
-            if (projectBuildingRequest.isResolveDependencies()) {
-                resolutionResult = resolveDependencies(project, config.session);
-            }
-
-            ProjectBuildingResult result = new DefaultProjectBuildingResult(project, modelProblems, resolutionResult);
-
-            if (error != null) {
-                ProjectBuildingException e = new ProjectBuildingException(Arrays.asList(result));
-                e.initCause(error);
-                throw e;
-            }
-
-            return result;
-        } finally {
-            Thread.currentThread().setContextClassLoader(oldContextClassLoader);
-        }
-    }
-
-    private DependencyResolutionResult resolveDependencies(MavenProject project, RepositorySystemSession session) {
-        DependencyResolutionResult resolutionResult;
-
-        try {
-            DefaultDependencyResolutionRequest resolution = new DefaultDependencyResolutionRequest(project, session);
-            resolutionResult = dependencyResolver.resolve(resolution);
-        } catch (DependencyResolutionException e) {
-            resolutionResult = e.getResult();
-        }
-
-        Set<Artifact> artifacts = new LinkedHashSet<>();
-        if (resolutionResult.getDependencyGraph() != null) {
-            RepositoryUtils.toArtifacts(
-                    artifacts,
-                    resolutionResult.getDependencyGraph().getChildren(),
-                    Collections.singletonList(project.getArtifact().getId()),
-                    null);
-
-            // Maven 2.x quirk: an artifact always points at the local repo, regardless whether resolved or not
-            LocalRepositoryManager lrm = session.getLocalRepositoryManager();
-            for (Artifact artifact : artifacts) {
-                if (!artifact.isResolved()) {
-                    String path = lrm.getPathForLocalArtifact(RepositoryUtils.toArtifact(artifact));
-                    artifact.setFile(new File(lrm.getRepository().getBasedir(), path));
-                }
-            }
-        }
-        project.setResolvedArtifacts(artifacts);
-
-        return resolutionResult;
-    }
-
-    private List<String> getProfileIds(List<Profile> profiles) {
-        return profiles.stream().map(Profile::getId).collect(Collectors.toList());
-    }
-
-    private ModelBuildingRequest getModelBuildingRequest(InternalConfig config) {
-        ProjectBuildingRequest configuration = config.request;
-
-        ModelBuildingRequest request = new DefaultModelBuildingRequest();
-
-        RequestTrace trace = RequestTrace.newChild(null, configuration).newChild(request);
-
-        ModelResolver resolver = new ProjectModelResolver(
-                config.session,
-                trace,
-                repoSystem,
-                repositoryManager,
-                config.repositories,
-                configuration.getRepositoryMerging(),
-                config.modelPool);
-
-        request.setValidationLevel(configuration.getValidationLevel());
-        request.setProcessPlugins(configuration.isProcessPlugins());
-        request.setProfiles(configuration.getProfiles());
-        request.setActiveProfileIds(configuration.getActiveProfileIds());
-        request.setInactiveProfileIds(configuration.getInactiveProfileIds());
-        request.setSystemProperties(configuration.getSystemProperties());
-        request.setUserProperties(configuration.getUserProperties());
-        request.setBuildStartTime(configuration.getBuildStartTime());
-        request.setModelResolver(resolver);
-        // this is a hint that we want to build 1 file, so don't cache. See MNG-7063
-        if (config.modelPool != null) {
-            request.setModelCache(new SnapshotModelCache(modelCache, DefaultModelCache.newInstance(config.session)));
-        }
-        request.setTransformerContextBuilder(config.transformerContextBuilder);
-
-        return request;
-    }
-
-    @Override
-    public ProjectBuildingResult build(Artifact artifact, ProjectBuildingRequest request)
-            throws ProjectBuildingException {
-        return build(artifact, false, request);
-    }
-
-    @Override
-    public ProjectBuildingResult build(Artifact artifact, boolean allowStubModel, ProjectBuildingRequest request)
-            throws ProjectBuildingException {
-        org.eclipse.aether.artifact.Artifact pomArtifact = RepositoryUtils.toArtifact(artifact);
-        pomArtifact = ArtifactDescriptorUtils.toPomArtifact(pomArtifact);
-
-        InternalConfig config = new InternalConfig(request, null, null);
-
-        boolean localProject;
-
-        try {
-            ArtifactRequest pomRequest = new ArtifactRequest();
-            pomRequest.setArtifact(pomArtifact);
-            pomRequest.setRepositories(config.repositories);
-            ArtifactResult pomResult = repoSystem.resolveArtifact(config.session, pomRequest);
-
-            pomArtifact = pomResult.getArtifact();
-            localProject = pomResult.getRepository() instanceof WorkspaceRepository;
-        } catch (org.eclipse.aether.resolution.ArtifactResolutionException e) {
-            if (e.getResults().get(0).isMissing() && allowStubModel) {
-                return build(null, createStubModelSource(artifact), config);
-            }
-            throw new ProjectBuildingException(
-                    artifact.getId(), "Error resolving project artifact: " + e.getMessage(), e);
-        }
-
-        File pomFile = pomArtifact.getFile();
-
-        if ("pom".equals(artifact.getType())) {
-            artifact.selectVersion(pomArtifact.getVersion());
-            artifact.setFile(pomFile);
-            artifact.setResolved(true);
-        }
-
-        if (localProject) {
-            return build(pomFile, new FileModelSource(pomFile), config);
-        } else {
-            return build(
-                    null,
-                    new ArtifactModelSource(
-                            pomFile, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion()),
-                    config);
-        }
-    }
-
-    private ModelSource createStubModelSource(Artifact artifact) {
-        StringBuilder buffer = new StringBuilder(1024);
-
-        buffer.append("<?xml version='1.0'?>");
-        buffer.append("<project>");
-        buffer.append("<modelVersion>4.0.0</modelVersion>");
-        buffer.append("<groupId>").append(artifact.getGroupId()).append("</groupId>");
-        buffer.append("<artifactId>").append(artifact.getArtifactId()).append("</artifactId>");
-        buffer.append("<version>").append(artifact.getBaseVersion()).append("</version>");
-        buffer.append("<packaging>").append(artifact.getType()).append("</packaging>");
-        buffer.append("</project>");
-
-        return new StringModelSource(buffer, artifact.getId());
-    }
-
-    @Override
-    public List<ProjectBuildingResult> build(List<File> pomFiles, boolean recursive, ProjectBuildingRequest request)
-            throws ProjectBuildingException {
-        List<ProjectBuildingResult> results = new ArrayList<>();
-
-        List<InterimResult> interimResults = new ArrayList<>();
-
-        ReactorModelPool.Builder poolBuilder = new ReactorModelPool.Builder();
-        final ReactorModelPool modelPool = poolBuilder.build();
-
-        InternalConfig config = new InternalConfig(request, modelPool, modelBuilder.newTransformerContextBuilder());
-
-        Map<File, MavenProject> projectIndex = new HashMap<>(256);
-
-        // phase 1: get file Models from the reactor.
-        boolean noErrors = build(
-                results,
-                interimResults,
-                projectIndex,
-                pomFiles,
-                new LinkedHashSet<>(),
-                true,
-                recursive,
-                config,
-                poolBuilder);
-
-        ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
-
-        try {
-            // Phase 2: get effective models from the reactor
-            noErrors = build(
-                            results,
-                            new ArrayList<>(),
-                            projectIndex,
-                            interimResults,
-                            request,
-                            new HashMap<>(),
-                            config.session)
-                    && noErrors;
-        } finally {
-            Thread.currentThread().setContextClassLoader(oldContextClassLoader);
-        }
-
-        if (Features.buildConsumer(request.getUserProperties()).isActive()) {
-            request.getRepositorySession()
-                    .getData()
-                    .set(TransformerContext.KEY, config.transformerContextBuilder.build());
-        }
-
-        if (!noErrors) {
-            throw new ProjectBuildingException(results);
-        }
-
-        return results;
-    }
-
-    @SuppressWarnings("checkstyle:parameternumber")
-    private boolean build(
-            List<ProjectBuildingResult> results,
-            List<InterimResult> interimResults,
-            Map<File, MavenProject> projectIndex,
-            List<File> pomFiles,
-            Set<File> aggregatorFiles,
-            boolean root,
-            boolean recursive,
-            InternalConfig config,
-            ReactorModelPool.Builder poolBuilder) {
-        boolean noErrors = true;
-
-        for (File pomFile : pomFiles) {
-            aggregatorFiles.add(pomFile);
-
-            if (!build(
-                    results,
-                    interimResults,
-                    projectIndex,
-                    pomFile,
-                    aggregatorFiles,
-                    root,
-                    recursive,
-                    config,
-                    poolBuilder)) {
-                noErrors = false;
-            }
-
-            aggregatorFiles.remove(pomFile);
-        }
-
-        return noErrors;
-    }
-
-    @SuppressWarnings("checkstyle:parameternumber")
-    private boolean build(
-            List<ProjectBuildingResult> results,
-            List<InterimResult> interimResults,
-            Map<File, MavenProject> projectIndex,
-            File pomFile,
-            Set<File> aggregatorFiles,
-            boolean isRoot,
-            boolean recursive,
-            InternalConfig config,
-            ReactorModelPool.Builder poolBuilder) {
-        boolean noErrors = true;
-
-        MavenProject project = new MavenProject();
-        project.setFile(pomFile);
-
-        ModelBuildingRequest request = getModelBuildingRequest(config)
-                .setPomFile(pomFile)
-                .setTwoPhaseBuilding(true)
-                .setLocationTracking(true);
-
-        DefaultModelBuildingListener listener =
-                new DefaultModelBuildingListener(project, projectBuildingHelper, config.request);
-        request.setModelBuildingListener(listener);
-
-        ModelBuildingResult result;
-        try {
-            result = modelBuilder.build(request);
-        } catch (ModelBuildingException e) {
-            result = e.getResult();
-            if (result == null || result.getFileModel() == null) {
-                results.add(new DefaultProjectBuildingResult(e.getModelId(), pomFile, e.getProblems()));
-
-                return false;
-            }
-            // validation error, continue project building and delay failing to help IDEs
-            // result.getProblems().addAll(e.getProblems()) ?
-            noErrors = false;
-        }
-
-        Model model = result.getFileModel().clone();
-
-        poolBuilder.put(model.getPomFile().toPath(), model);
-
-        InterimResult interimResult = new InterimResult(pomFile, request, result, listener, isRoot);
-        interimResults.add(interimResult);
-
-        if (recursive) {
-            File basedir = pomFile.getParentFile();
-            List<File> moduleFiles = new ArrayList<>();
-            for (String module : model.getModules()) {
-                if (StringUtils.isEmpty(module)) {
-                    continue;
-                }
-
-                module = module.replace('\\', File.separatorChar).replace('/', File.separatorChar);
-
-                File moduleFile = new File(basedir, module);
-
-                if (moduleFile.isDirectory()) {
-                    moduleFile = modelProcessor.locatePom(moduleFile);
-                }
-
-                if (!moduleFile.isFile()) {
-                    ModelProblem problem = new DefaultModelProblem(
-                            "Child module " + moduleFile + " of " + pomFile + " does not exist",
-                            ModelProblem.Severity.ERROR,
-                            ModelProblem.Version.BASE,
-                            model,
-                            -1,
-                            -1,
-                            null);
-                    result.getProblems().add(problem);
-
-                    noErrors = false;
-
-                    continue;
-                }
-
-                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
-                    // we don't canonicalize on unix to avoid interfering with symlinks
-                    try {
-                        moduleFile = moduleFile.getCanonicalFile();
-                    } catch (IOException e) {
-                        moduleFile = moduleFile.getAbsoluteFile();
-                    }
-                } else {
-                    moduleFile = new File(moduleFile.toURI().normalize());
-                }
-
-                if (aggregatorFiles.contains(moduleFile)) {
-                    StringBuilder buffer = new StringBuilder(256);
-                    for (File aggregatorFile : aggregatorFiles) {
-                        buffer.append(aggregatorFile).append(" -> ");
-                    }
-                    buffer.append(moduleFile);
-
-                    ModelProblem problem = new DefaultModelProblem(
-                            "Child module " + moduleFile + " of " + pomFile + " forms aggregation cycle " + buffer,
-                            ModelProblem.Severity.ERROR,
-                            ModelProblem.Version.BASE,
-                            model,
-                            -1,
-                            -1,
-                            null);
-                    result.getProblems().add(problem);
-
-                    noErrors = false;
-
-                    continue;
-                }
-
-                moduleFiles.add(moduleFile);
-            }
-
-            interimResult.modules = new ArrayList<>();
-
-            if (!build(
-                    results,
-                    interimResult.modules,
-                    projectIndex,
-                    moduleFiles,
-                    aggregatorFiles,
-                    false,
-                    recursive,
-                    config,
-                    poolBuilder)) {
-                noErrors = false;
-            }
-        }
-
-        projectIndex.put(pomFile, project);
-
-        return noErrors;
-    }
-
-    static class InterimResult {
-
-        File pomFile;
-
-        ModelBuildingRequest request;
-
-        ModelBuildingResult result;
-
-        DefaultModelBuildingListener listener;
-
-        boolean root;
-
-        List<InterimResult> modules = Collections.emptyList();
-
-        InterimResult(
-                File pomFile,
-                ModelBuildingRequest request,
-                ModelBuildingResult result,
-                DefaultModelBuildingListener listener,
-                boolean root) {
-            this.pomFile = pomFile;
-            this.request = request;
-            this.result = result;
-            this.listener = listener;
-            this.root = root;
-        }
-    }
-
-    private boolean build(
-            List<ProjectBuildingResult> results,
-            List<MavenProject> projects,
-            Map<File, MavenProject> projectIndex,
-            List<InterimResult> interimResults,
-            ProjectBuildingRequest request,
-            Map<File, Boolean> profilesXmls,
-            RepositorySystemSession session) {
-        boolean noErrors = true;
-
-        for (InterimResult interimResult : interimResults) {
-            MavenProject project = interimResult.listener.getProject();
-            try {
-                ModelBuildingResult result = modelBuilder.build(interimResult.request, interimResult.result);
-
-                // 2nd pass of initialization: resolve and build parent if necessary
-                try {
-                    initProject(project, projectIndex, true, result, profilesXmls, request);
-                } catch (InvalidArtifactRTException iarte) {
-                    result.getProblems()
-                            .add(new DefaultModelProblem(
-                                    null,
-                                    ModelProblem.Severity.ERROR,
-                                    null,
-                                    result.getEffectiveModel(),
-                                    -1,
-                                    -1,
-                                    iarte));
-                }
-
-                List<MavenProject> modules = new ArrayList<>();
-                noErrors = build(results, modules, projectIndex, interimResult.modules, request, profilesXmls, session)
-                        && noErrors;
-
-                projects.addAll(modules);
-                projects.add(project);
-
-                project.setExecutionRoot(interimResult.root);
-                project.setCollectedProjects(modules);
-                DependencyResolutionResult resolutionResult = null;
-                if (request.isResolveDependencies()) {
-                    resolutionResult = resolveDependencies(project, session);
-                }
-
-                results.add(new DefaultProjectBuildingResult(project, result.getProblems(), resolutionResult));
-            } catch (ModelBuildingException e) {
-                DefaultProjectBuildingResult result = null;
-                if (project == null || interimResult.result.getEffectiveModel() == null) {
-                    result = new DefaultProjectBuildingResult(e.getModelId(), interimResult.pomFile, e.getProblems());
-                } else {
-                    project.setModel(interimResult.result.getEffectiveModel());
-
-                    result = new DefaultProjectBuildingResult(project, e.getProblems(), null);
-                }
-                results.add(result);
-
-                noErrors = false;
-            }
-        }
-
-        return noErrors;
-    }
-
-    @SuppressWarnings({"checkstyle:methodlength", "deprecation"})
-    private void initProject(
-            MavenProject project,
-            Map<File, MavenProject> projects,
-            boolean buildParentIfNotExisting,
-            ModelBuildingResult result,
-            Map<File, Boolean> profilesXmls,
-            ProjectBuildingRequest projectBuildingRequest) {
-        Model model = result.getEffectiveModel();
-
-        project.setModel(model);
-        project.setOriginalModel(result.getFileModel());
-
-        initParent(project, projects, buildParentIfNotExisting, result, projectBuildingRequest);
-
-        Artifact projectArtifact = repositorySystem.createArtifact(
-                project.getGroupId(), project.getArtifactId(), project.getVersion(), null, project.getPackaging());
-        project.setArtifact(projectArtifact);
-
-        if (project.getFile() != null && buildParentIfNotExisting) // only set those on 2nd phase, ignore on 1st pass
-        {
-            Build build = project.getBuild();
-            project.addScriptSourceRoot(build.getScriptSourceDirectory());
-            project.addCompileSourceRoot(build.getSourceDirectory());
-            project.addTestCompileSourceRoot(build.getTestSourceDirectory());
-        }
-
-        List<Profile> activeProfiles = new ArrayList<>();
-        activeProfiles.addAll(result.getActivePomProfiles(result.getModelIds().get(0)));
-        activeProfiles.addAll(result.getActiveExternalProfiles());
-        project.setActiveProfiles(activeProfiles);
-
-        project.setInjectedProfileIds("external", getProfileIds(result.getActiveExternalProfiles()));
-        for (String modelId : result.getModelIds()) {
-            project.setInjectedProfileIds(modelId, getProfileIds(result.getActivePomProfiles(modelId)));
-        }
-
-        //
-        // All the parts that were taken out of MavenProject for Maven 4.0.0
-        //
-
-        project.setProjectBuildingRequest(projectBuildingRequest);
-
-        // pluginArtifacts
-        Set<Artifact> pluginArtifacts = new HashSet<>();
-        for (Plugin plugin : project.getBuildPlugins()) {
-            Artifact artifact = repositorySystem.createPluginArtifact(plugin);
-
-            if (artifact != null) {
-                pluginArtifacts.add(artifact);
-            }
-        }
-        project.setPluginArtifacts(pluginArtifacts);
-
-        // reportArtifacts
-        Set<Artifact> reportArtifacts = new HashSet<>();
-        for (ReportPlugin report : project.getReportPlugins()) {
-            Plugin pp = new Plugin();
-            pp.setGroupId(report.getGroupId());
-            pp.setArtifactId(report.getArtifactId());
-            pp.setVersion(report.getVersion());
-
-            Artifact artifact = repositorySystem.createPluginArtifact(pp);
-
-            if (artifact != null) {
-                reportArtifacts.add(artifact);
-            }
-        }
-        project.setReportArtifacts(reportArtifacts);
-
-        // extensionArtifacts
-        Set<Artifact> extensionArtifacts = new HashSet<>();
-        List<Extension> extensions = project.getBuildExtensions();
-        if (extensions != null) {
-            for (Extension ext : extensions) {
-                String version;
-                if (StringUtils.isEmpty(ext.getVersion())) {
-                    version = "RELEASE";
-                } else {
-                    version = ext.getVersion();
-                }
-
-                Artifact artifact =
-                        repositorySystem.createArtifact(ext.getGroupId(), ext.getArtifactId(), version, null, "jar");
-
-                if (artifact != null) {
-                    extensionArtifacts.add(artifact);
-                }
-            }
-        }
-        project.setExtensionArtifacts(extensionArtifacts);
-
-        // managedVersionMap
-        Map<String, Artifact> map = null;
-        if (repositorySystem != null) {
-            final DependencyManagement dependencyManagement = project.getDependencyManagement();
-            if ((dependencyManagement != null)
-                    && ((dependencyManagement.getDependencies()) != null)
-                    && (dependencyManagement.getDependencies().size() > 0)) {
-                map = new AbstractMap<String, Artifact>() {
-                    HashMap<String, Artifact> delegate;
-
-                    @Override
-                    public Set<Entry<String, Artifact>> entrySet() {
-                        return Collections.unmodifiableSet(compute().entrySet());
-                    }
-
-                    @Override
-                    public Set<String> keySet() {
-                        return Collections.unmodifiableSet(compute().keySet());
-                    }
-
-                    @Override
-                    public Collection<Artifact> values() {
-                        return Collections.unmodifiableCollection(compute().values());
-                    }
-
-                    @Override
-                    public boolean containsValue(Object value) {
-                        return compute().containsValue(value);
-                    }
-
-                    @Override
-                    public boolean containsKey(Object key) {
-                        return compute().containsKey(key);
-                    }
-
-                    @Override
-                    public Artifact get(Object key) {
-                        return compute().get(key);
-                    }
-
-                    HashMap<String, Artifact> compute() {
-                        if (delegate == null) {
-                            delegate = new HashMap<>();
-                            for (Dependency d : dependencyManagement.getDependencies()) {
-                                Artifact artifact = repositorySystem.createDependencyArtifact(d);
-
-                                if (artifact != null) {
-                                    delegate.put(d.getManagementKey(), artifact);
-                                }
-                            }
-                        }
-
-                        return delegate;
-                    }
-                };
-            } else {
-                map = Collections.emptyMap();
-            }
-        }
-        project.setManagedVersionMap(map);
-
-        // release artifact repository
-        if (project.getDistributionManagement() != null
-                && project.getDistributionManagement().getRepository() != null) {
-            try {
-                DeploymentRepository r = project.getDistributionManagement().getRepository();
-                if (!StringUtils.isEmpty(r.getId()) && !StringUtils.isEmpty(r.getUrl())) {
-                    ArtifactRepository repo = MavenRepositorySystem.buildArtifactRepository(r);
-                    repositorySystem.injectProxy(projectBuildingRequest.getRepositorySession(), Arrays.asList(repo));
-                    repositorySystem.injectAuthentication(
-                            projectBuildingRequest.getRepositorySession(), Arrays.asList(repo));
-                    project.setReleaseArtifactRepository(repo);
-                }
-            } catch (InvalidRepositoryException e) {
-                throw new IllegalStateException(
-                        "Failed to create release distribution repository for " + project.getId(), e);
-            }
-        }
-
-        // snapshot artifact repository
-        if (project.getDistributionManagement() != null
-                && project.getDistributionManagement().getSnapshotRepository() != null) {
-            try {
-                DeploymentRepository r = project.getDistributionManagement().getSnapshotRepository();
-                if (!StringUtils.isEmpty(r.getId()) && !StringUtils.isEmpty(r.getUrl())) {
-                    ArtifactRepository repo = MavenRepositorySystem.buildArtifactRepository(r);
-                    repositorySystem.injectProxy(projectBuildingRequest.getRepositorySession(), Arrays.asList(repo));
-                    repositorySystem.injectAuthentication(
-                            projectBuildingRequest.getRepositorySession(), Arrays.asList(repo));
-                    project.setSnapshotArtifactRepository(repo);
-                }
-            } catch (InvalidRepositoryException e) {
-                throw new IllegalStateException(
-                        "Failed to create snapshot distribution repository for " + project.getId(), e);
-            }
-        }
-    }
-
-    private void initParent(
-            MavenProject project,
-            Map<File, MavenProject> projects,
-            boolean buildParentIfNotExisting,
-            ModelBuildingResult result,
-            ProjectBuildingRequest projectBuildingRequest) {
-        Model parentModel =
-                result.getModelIds().size() > 1 && !result.getModelIds().get(1).isEmpty()
-                        ? result.getRawModel(result.getModelIds().get(1))
-                        : null;
-
-        if (parentModel != null) {
-            final String parentGroupId = inheritedGroupId(result, 1);
-            final String parentVersion = inheritedVersion(result, 1);
-
-            project.setParentArtifact(
-                    repositorySystem.createProjectArtifact(parentGroupId, parentModel.getArtifactId(), parentVersion));
-
-            // org.apache.maven.its.mng4834:parent:0.1
-            String parentModelId = result.getModelIds().get(1);
-            File parentPomFile = result.getRawModel(parentModelId).getPomFile();
-            MavenProject parent = projects.get(parentPomFile);
-            if (parent == null && buildParentIfNotExisting) {
-                //
-                // At this point the DefaultModelBuildingListener has fired and it populates the
-                // remote repositories with those found in the pom.xml, along with the existing externally
-                // defined repositories.
-                //
-                projectBuildingRequest.setRemoteRepositories(project.getRemoteArtifactRepositories());
-                if (parentPomFile != null) {
-                    project.setParentFile(parentPomFile);
-                    try {
-                        parent = build(parentPomFile, projectBuildingRequest).getProject();
-                    } catch (ProjectBuildingException e) {
-                        // MNG-4488 where let invalid parents slide on by
-                        if (logger.isDebugEnabled()) {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn("Failed to build parent project for " + project.getId(), e);
-                        } else {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn("Failed to build parent project for " + project.getId());
-                        }
-                    }
-                } else {
-                    Artifact parentArtifact = project.getParentArtifact();
-                    try {
-                        parent = build(parentArtifact, projectBuildingRequest).getProject();
-                    } catch (ProjectBuildingException e) {
-                        // MNG-4488 where let invalid parents slide on by
-                        if (logger.isDebugEnabled()) {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn("Failed to build parent project for " + project.getId(), e);
-                        } else {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn("Failed to build parent project for " + project.getId());
-                        }
-                    }
-                }
-            }
-            project.setParent(parent);
-            if (project.getParentFile() == null && parent != null) {
-                project.setParentFile(parent.getFile());
-            }
-        }
-    }
-
-    private static String inheritedGroupId(final ModelBuildingResult result, final int modelIndex) {
-        String groupId = null;
-        final String modelId = result.getModelIds().get(modelIndex);
-
-        if (!modelId.isEmpty()) {
-            final Model model = result.getRawModel(modelId);
-            groupId = model.getGroupId() != null ? model.getGroupId() : inheritedGroupId(result, modelIndex + 1);
-        }
-
-        return groupId;
-    }
-
-    private static String inheritedVersion(final ModelBuildingResult result, final int modelIndex) {
-        String version = null;
-        final String modelId = result.getModelIds().get(modelIndex);
-
-        if (!modelId.isEmpty()) {
-            final Model model = result.getRawModel(modelId);
-            version = model.getVersion() != null ? model.getVersion() : inheritedVersion(result, modelIndex + 1);
-        }
-
-        return version;
-    }
-
-    /**
-     * InternalConfig
-     */
-    class InternalConfig {
-
-        private final ProjectBuildingRequest request;
-
-        private final RepositorySystemSession session;
-
-        private final List<RemoteRepository> repositories;
-
-        private final ReactorModelPool modelPool;
-
-        private final TransformerContextBuilder transformerContextBuilder;
-
-        InternalConfig(
-                ProjectBuildingRequest request,
-                ReactorModelPool modelPool,
-                TransformerContextBuilder transformerContextBuilder) {
-            this.request = request;
-            this.modelPool = modelPool;
-            this.transformerContextBuilder = transformerContextBuilder;
-
-            session = LegacyLocalRepositoryManager.overlay(
-                    request.getLocalRepository(), request.getRepositorySession(), repoSystem);
-            repositories = RepositoryUtils.toRepos(request.getRemoteRepositories());
-        }
-    }
-}
diff --git a/daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java b/daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java
index c654dd90..39ff8b04 100644
--- a/daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java
+++ b/daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java
@@ -18,6 +18,7 @@
  */
 package org.apache.maven.project;
 
+import org.apache.maven.building.Source;
 import org.apache.maven.model.building.ModelCache;
 
 public class SnapshotModelCache implements ModelCache {
@@ -30,6 +31,14 @@ public class SnapshotModelCache implements ModelCache {
         this.reactorCache = reactorCache;
     }
 
+    public Object get(Source path, String tag) {
+        return reactorCache.get(path, tag);
+    }
+
+    public void put(Source path, String tag, Object data) {
+        reactorCache.put(path, tag, data);
+    }
+
     @Override
     public void put(String groupId, String artifactId, String version, String tag, Object data) {
         getDelegate(version).put(groupId, artifactId, version, tag, data);
diff --git a/daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java b/daemon/src/main/java/org/apache/maven/project/SnapshotModelCacheFactory.java
similarity index 52%
copy from daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java
copy to daemon/src/main/java/org/apache/maven/project/SnapshotModelCacheFactory.java
index c654dd90..a070c7c5 100644
--- a/daemon/src/main/java/org/apache/maven/project/SnapshotModelCache.java
+++ b/daemon/src/main/java/org/apache/maven/project/SnapshotModelCacheFactory.java
@@ -18,29 +18,33 @@
  */
 package org.apache.maven.project;
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.model.building.ModelCache;
+import org.apache.maven.repository.internal.DefaultModelCacheFactory;
+import org.apache.maven.repository.internal.ModelCacheFactory;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.sisu.Priority;
 
-public class SnapshotModelCache implements ModelCache {
+@Singleton
+@Named
+@Priority(10)
+public class SnapshotModelCacheFactory implements ModelCacheFactory {
 
+    private final ModelCacheFactory factory;
     private final ModelCache globalCache;
-    private final ModelCache reactorCache;
-
-    public SnapshotModelCache(ModelCache globalCache, ModelCache reactorCache) {
-        this.globalCache = globalCache;
-        this.reactorCache = reactorCache;
-    }
 
-    @Override
-    public void put(String groupId, String artifactId, String version, String tag, Object data) {
-        getDelegate(version).put(groupId, artifactId, version, tag, data);
+    @Inject
+    public SnapshotModelCacheFactory(DefaultModelCacheFactory factory) {
+        this.factory = factory;
+        this.globalCache = factory.createCache(new DefaultRepositorySystemSession());
     }
 
     @Override
-    public Object get(String groupId, String artifactId, String version, String tag) {
-        return getDelegate(version).get(groupId, artifactId, version, tag);
-    }
-
-    private ModelCache getDelegate(String version) {
-        return version.contains("SNAPSHOT") || version.contains("${") ? reactorCache : globalCache;
+    public ModelCache createCache(RepositorySystemSession session) {
+        return new SnapshotModelCache(globalCache, factory.createCache(session));
     }
 }