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.git


The following commit(s) were added to refs/heads/master by this push:
     new ae655e0e8 [MNG-7553] v4 api enhancements
ae655e0e8 is described below

commit ae655e0e83e47ec7389763bcabe9d84e92862179
Author: Guillaume Nodet <[email protected]>
AuthorDate: Mon Oct 10 20:47:26 2022 +0200

    [MNG-7553] v4 api enhancements
    
    * Fix DefaultArtifactManager to allow using both Artifact and Dependency
    * Add a TODO for an EventSpy related api
    * Add simple string/model conversion on the XmlFactory
    * Decouple services creation
    * Move services to @Singleton scope
    * Add protected constructors as builders should not be created directly
    * Fix typos "can not" -> "cannot"
    * Add some null checks on build(xx) shortcut methods
    * Add a some missing conversion to immutable collections for requests
---
 .../main/java/org/apache/maven/api/Listener.java   |  1 +
 .../main/java/org/apache/maven/api/Toolchain.java  |  2 +-
 .../services/ArtifactCoordinateFactoryRequest.java | 23 ++++--
 .../api/services/ArtifactDeployerRequest.java      | 14 ++--
 .../maven/api/services/ArtifactFactoryRequest.java | 10 ++-
 .../maven/api/services/ArtifactInstaller.java      |  4 +-
 .../api/services/ArtifactInstallerRequest.java     | 12 ++-
 .../api/services/ArtifactResolverRequest.java      | 15 +++-
 .../org/apache/maven/api/services/BaseRequest.java |  2 +-
 .../api/services/DependencyCollectorRequest.java   | 23 +++---
 .../DependencyCoordinateFactoryRequest.java        | 26 +++++--
 .../apache/maven/api/services/ProjectBuilder.java  | 10 +--
 .../maven/api/services/ProjectBuilderRequest.java  | 20 +++--
 .../apache/maven/api/services/xml/XmlFactory.java  | 30 ++++++++
 .../main/java/org/apache/maven/DefaultMaven.java   |  2 +
 .../impl/DefaultArtifactCoordinateFactory.java     |  2 +
 .../internal/impl/DefaultArtifactDeployer.java     |  2 +
 .../internal/impl/DefaultArtifactFactory.java      |  2 +
 .../internal/impl/DefaultArtifactInstaller.java    |  7 ++
 .../internal/impl/DefaultArtifactManager.java      | 31 ++++----
 .../internal/impl/DefaultArtifactResolver.java     |  4 +
 .../internal/impl/DefaultDependencyCollector.java  |  2 +
 .../impl/DefaultDependencyCoordinateFactory.java   |  2 +
 .../impl/DefaultLocalRepositoryManager.java        |  5 ++
 .../apache/maven/internal/impl/DefaultLookup.java  |  7 ++
 .../impl/DefaultMessageBuilderFactory.java         |  5 ++
 .../internal/impl/DefaultModelXmlFactory.java      | 36 ++++++++-
 .../maven/internal/impl/DefaultProjectBuilder.java |  4 +
 .../maven/internal/impl/DefaultProjectManager.java |  7 ++
 .../maven/internal/impl/DefaultPrompter.java       |  7 ++
 .../internal/impl/DefaultRepositoryFactory.java    |  7 ++
 .../apache/maven/internal/impl/DefaultSession.java | 87 +++++-----------------
 .../maven/internal/impl/DefaultSessionFactory.java | 23 +-----
 .../internal/impl/DefaultSettingsXmlFactory.java   |  5 ++
 .../internal/impl/DefaultToolchainManager.java     |  7 ++
 .../internal/impl/DefaultToolchainsXmlFactory.java |  6 ++
 .../maven/internal/impl/DefaultTypeRegistry.java   |  7 ++
 .../maven/internal/impl/DefaultVersionParser.java  |  5 ++
 .../session/scope/internal/SessionScopeModule.java |  2 +
 .../maven/AbstractCoreMavenComponentTestCase.java  | 33 ++++----
 .../org/apache/maven/internal/impl/TestApi.java    | 35 +++++----
 41 files changed, 345 insertions(+), 189 deletions(-)

diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/Listener.java 
b/api/maven-api-core/src/main/java/org/apache/maven/api/Listener.java
index 924ddaeaa..f6657da4d 100644
--- a/api/maven-api-core/src/main/java/org/apache/maven/api/Listener.java
+++ b/api/maven-api-core/src/main/java/org/apache/maven/api/Listener.java
@@ -25,6 +25,7 @@ import org.apache.maven.api.annotations.Nonnull;
 
 /**
  * A listener for session events.
+ * TODO: open this to other events like {@link 
org.apache.maven.eventspy.EventSpy}
  *
  * @since 4.0
  */
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/Toolchain.java 
b/api/maven-api-core/src/main/java/org/apache/maven/api/Toolchain.java
index 2f497194e..1d013ff19 100644
--- a/api/maven-api-core/src/main/java/org/apache/maven/api/Toolchain.java
+++ b/api/maven-api-core/src/main/java/org/apache/maven/api/Toolchain.java
@@ -42,7 +42,7 @@ public interface Toolchain
      * Gets the platform tool executable.
      *
      * @param toolName the tool platform independent tool name.
-     * @return file representing the tool executable, or null if the tool can 
not be found
+     * @return file representing the tool executable, or null if the tool 
cannot be found
      */
     String findTool( String toolName );
 
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinateFactoryRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinateFactoryRequest.java
index 8c8b9af06..c93d249d8 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinateFactoryRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinateFactoryRequest.java
@@ -26,6 +26,8 @@ import org.apache.maven.api.annotations.Immutable;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.NotThreadSafe;
 
+import static org.apache.maven.api.services.BaseRequest.nonNull;
+
 /**
  * A request for creating a {@link ArtifactCoordinate} object.
  *
@@ -51,11 +53,12 @@ public interface ArtifactCoordinateFactoryRequest
 
     String getType();
 
-    static ArtifactCoordinateFactoryRequest build( Session session, String 
groupId, String artifactId,
+    @Nonnull
+    static ArtifactCoordinateFactoryRequest build( @Nonnull Session session, 
String groupId, String artifactId,
                                                    String version, String 
extension )
     {
         return ArtifactCoordinateFactoryRequest.builder()
-                .session( session )
+                .session( nonNull( session, "session cannot be null" ) )
                 .groupId( groupId )
                 .artifactId( artifactId )
                 .version( version )
@@ -63,11 +66,12 @@ public interface ArtifactCoordinateFactoryRequest
                 .build();
     }
 
-    static ArtifactCoordinateFactoryRequest build( Session session, String 
groupId, String artifactId,
+    @Nonnull
+    static ArtifactCoordinateFactoryRequest build( @Nonnull Session session, 
String groupId, String artifactId,
                                                    String version, String 
classifier, String extension, String type )
     {
         return ArtifactCoordinateFactoryRequest.builder()
-                .session( session )
+                .session( nonNull( session, "session cannot be null" ) )
                 .groupId( groupId )
                 .artifactId( artifactId )
                 .version( version )
@@ -77,11 +81,12 @@ public interface ArtifactCoordinateFactoryRequest
                 .build();
     }
 
-    static ArtifactCoordinateFactoryRequest build( Session session, 
ArtifactCoordinate coordinate )
+    @Nonnull
+    static ArtifactCoordinateFactoryRequest build( @Nonnull Session session, 
@Nonnull ArtifactCoordinate coordinate )
     {
         return ArtifactCoordinateFactoryRequest.builder()
-                .session( session )
-                .groupId( coordinate.getGroupId() )
+                .session( nonNull( session, "session cannot be null" ) )
+                .groupId( nonNull( coordinate, "coordinate cannot be null" 
).getGroupId() )
                 .artifactId( coordinate.getArtifactId() )
                 .classifier( coordinate.getClassifier() )
                 .version( coordinate.getVersion().asString() )
@@ -106,6 +111,10 @@ public interface ArtifactCoordinateFactoryRequest
         private String extension;
         private String type;
 
+        ArtifactFactoryRequestBuilder()
+        {
+        }
+
         public ArtifactFactoryRequestBuilder session( Session session )
         {
             this.session = session;
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
index a87c0fbfc..6fb3eecbe 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java
@@ -64,9 +64,9 @@ public interface ArtifactDeployerRequest
                                           @Nonnull Collection<Artifact> 
artifacts )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .repository( repository )
-                .artifacts( artifacts )
+                .session( nonNull( session, "session cannot be null" ) )
+                .repository( nonNull( repository, "repository cannot be null" 
) )
+                .artifacts( nonNull( artifacts, "artifacts cannot be null" ) )
                 .build();
     }
 
@@ -77,6 +77,10 @@ public interface ArtifactDeployerRequest
         Collection<Artifact> artifacts;
         int retryFailedDeploymentCount;
 
+        ArtifactDeployerRequestBuilder()
+        {
+        }
+
         @Nonnull
         public ArtifactDeployerRequestBuilder session( Session session )
         {
@@ -123,8 +127,8 @@ public interface ArtifactDeployerRequest
                                             int retryFailedDeploymentCount )
             {
                 super( session );
-                this.repository = nonNull( repository, "repository can not be 
null" );
-                this.artifacts = nonNull( artifacts, "artifacts can not be 
null" );
+                this.repository = nonNull( repository, "repository cannot be 
null" );
+                this.artifacts = unmodifiable( nonNull( artifacts, "artifacts 
cannot be null" ) );
                 this.retryFailedDeploymentCount = retryFailedDeploymentCount;
             }
 
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
index eb7e3f96c..e351f3863 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java
@@ -26,6 +26,8 @@ import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.NotThreadSafe;
 
+import static org.apache.maven.api.services.BaseRequest.nonNull;
+
 /**
  *
  *
@@ -55,7 +57,7 @@ public interface ArtifactFactoryRequest
                                          String version, String extension )
     {
         return ArtifactFactoryRequest.builder()
-                .session( session )
+                .session( nonNull( session, "session cannot be null" ) )
                 .groupId( groupId )
                 .artifactId( artifactId )
                 .version( version )
@@ -67,7 +69,7 @@ public interface ArtifactFactoryRequest
                                          String version, String classifier, 
String extension, String type )
     {
         return ArtifactFactoryRequest.builder()
-                .session( session )
+                .session( nonNull( session, "session cannot be null" ) )
                 .groupId( groupId )
                 .artifactId( artifactId )
                 .version( version )
@@ -93,6 +95,10 @@ public interface ArtifactFactoryRequest
         private String extension;
         private String type;
 
+        ArtifactFactoryRequestBuilder()
+        {
+        }
+
         public ArtifactFactoryRequestBuilder session( Session session )
         {
             this.session = session;
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
index 5b07a88f8..937af5660 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstaller.java
@@ -46,7 +46,7 @@ public interface ArtifactInstaller extends Service
     /**
      * @param session the repository session
      * @param artifact the {@link Artifact} to install
-     * @throws ArtifactInstallerException In case of an error which can be the 
a given artifact can not be found or the
+     * @throws ArtifactInstallerException In case of an error which can be the 
a given artifact cannot be found or the
      *             installation has failed.
      * @throws IllegalArgumentException in case of parameter {@code session} 
is {@code null} or
      *          {@code artifact} is {@code null}.
@@ -59,7 +59,7 @@ public interface ArtifactInstaller extends Service
     /**
      * @param session the repository session
      * @param artifacts Collection of {@link Artifact MavenArtifacts}
-     * @throws ArtifactInstallerException In case of an error which can be the 
a given artifact can not be found or the
+     * @throws ArtifactInstallerException In case of an error which can be the 
a given artifact cannot be found or the
      *             installation has failed.
      * @throws IllegalArgumentException in case of parameter {@code request} 
is {@code null} or parameter
      *             {@code localRepository} is {@code null} or {@code 
localRepository} is not a directory
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
index 772203a85..dda5c09cd 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java
@@ -31,6 +31,8 @@ import java.util.Collections;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.Artifact;
 
+import static org.apache.maven.api.services.BaseRequest.nonNull;
+
 /**
  * A request for installing one or more artifacts in the local repository.
  *
@@ -57,8 +59,8 @@ public interface ArtifactInstallerRequest
     static ArtifactInstallerRequest build( Session session, 
Collection<Artifact> artifacts )
     {
         return builder()
-                .session( session )
-                .artifacts( artifacts )
+                .session( nonNull( session, "session cannot be null" ) )
+                .artifacts( nonNull( artifacts, "artifacts cannot be null" ) )
                 .build();
     }
 
@@ -68,6 +70,10 @@ public interface ArtifactInstallerRequest
         Session session;
         Collection<Artifact> artifacts = Collections.emptyList();
 
+        ArtifactInstallerRequestBuilder()
+        {
+        }
+
         @Nonnull
         public ArtifactInstallerRequestBuilder session( @Nonnull Session 
session )
         {
@@ -98,7 +104,7 @@ public interface ArtifactInstallerRequest
                                              @Nonnull Collection<Artifact> 
artifacts )
             {
                 super( session );
-                this.artifacts = nonNull( artifacts, "artifacts can not be 
null" );
+                this.artifacts = unmodifiable( nonNull( artifacts, "artifacts 
cannot be null" ) );
             }
 
             @Nonnull
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
index f35f326f1..3416c76ca 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
@@ -28,6 +28,8 @@ import org.apache.maven.api.annotations.Immutable;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.NotThreadSafe;
 
+import static org.apache.maven.api.services.BaseRequest.nonNull;
+
 /**
  * A request for resolving an artifact.
  *
@@ -50,11 +52,12 @@ public interface ArtifactResolverRequest
     }
 
     @Nonnull
-    static ArtifactResolverRequest build( Session session, Collection<? 
extends ArtifactCoordinate> coordinates )
+    static ArtifactResolverRequest build( @Nonnull Session session,
+                                          @Nonnull Collection<? extends 
ArtifactCoordinate> coordinates )
     {
         return builder()
-                .session( session )
-                .coordinates( coordinates )
+                .session( nonNull( session, "session cannot be null" ) )
+                .coordinates( nonNull( coordinates, "coordinates cannot be 
null" ) )
                 .build();
     }
 
@@ -64,6 +67,10 @@ public interface ArtifactResolverRequest
         Session session;
         Collection<? extends ArtifactCoordinate> coordinates;
 
+        ArtifactResolverRequestBuilder()
+        {
+        }
+
         @Nonnull
         public ArtifactResolverRequestBuilder session( Session session )
         {
@@ -93,7 +100,7 @@ public interface ArtifactResolverRequest
                                             @Nonnull Collection<? extends 
ArtifactCoordinate> coordinates )
             {
                 super( session );
-                this.coordinates = nonNull( coordinates, "coordinates can not 
be null" );
+                this.coordinates = unmodifiable( nonNull( coordinates, 
"coordinates cannot be null" ) );
             }
 
             @Nonnull
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/BaseRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/BaseRequest.java
index 86afa5a20..f3937b28a 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/BaseRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/BaseRequest.java
@@ -41,7 +41,7 @@ abstract class BaseRequest
 
     protected BaseRequest( @Nonnull Session session )
     {
-        this.session = nonNull( session, "session can not be null" );
+        this.session = nonNull( session, "session cannot be null" );
     }
 
     @Nonnull
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
index b0963205d..345db90ba 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCollectorRequest.java
@@ -73,8 +73,8 @@ public interface DependencyCollectorRequest
     static DependencyCollectorRequest build( @Nonnull Session session, 
Artifact root )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .rootArtifact( nonNull( root, "root can not be null" ) )
+                .session( nonNull( session, "session cannot be null" ) )
+                .rootArtifact( nonNull( root, "root cannot be null" ) )
                 .build();
     }
 
@@ -82,19 +82,17 @@ public interface DependencyCollectorRequest
     static DependencyCollectorRequest build( @Nonnull Session session, 
@Nonnull DependencyCoordinate root )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .root( nonNull( root, "root can not be null" ) )
+                .session( nonNull( session, "session cannot be null" ) )
+                .root( nonNull( root, "root cannot be null" ) )
                 .build();
     }
 
     @Nonnull
     static DependencyCollectorRequest build( @Nonnull Session session, 
@Nonnull Project project )
     {
-        nonNull( session, "session can not be null" );
-        nonNull( project, "project can not be null" );
         return builder()
-                .session( session )
-                .rootArtifact( project.getArtifact() )
+                .session( nonNull( session, "session cannot be null" ) )
+                .rootArtifact( nonNull( project, "project cannot be null" 
).getArtifact() )
                 .dependencies( project.getDependencies() )
                 .managedDependencies( project.getManagedDependencies() )
                 .build();
@@ -117,6 +115,10 @@ public interface DependencyCollectorRequest
         List<DependencyCoordinate> managedDependencies = 
Collections.emptyList();
         boolean verbose;
 
+        DependencyCollectorRequestBuilder()
+        {
+        }
+
         @Nonnull
         public DependencyCollectorRequestBuilder session( @Nonnull Session 
session )
         {
@@ -279,8 +281,9 @@ public interface DependencyCollectorRequest
                 super( session );
                 this.rootArtifact = rootArtifact;
                 this.root = root;
-                this.dependencies = unmodifiable( dependencies );
-                this.managedDependencies = unmodifiable( managedDependencies );
+                this.dependencies = unmodifiable( nonNull( dependencies, 
"dependencies cannot be null" ) );
+                this.managedDependencies = unmodifiable( nonNull( 
managedDependencies,
+                                                         "managedDependencies 
cannot be null" ) );
                 this.verbose = verbose;
             }
 
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinateFactoryRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinateFactoryRequest.java
index b42853cd5..2573fe427 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinateFactoryRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinateFactoryRequest.java
@@ -32,6 +32,8 @@ import org.apache.maven.api.annotations.Immutable;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.NotThreadSafe;
 
+import static org.apache.maven.api.services.BaseRequest.nonNull;
+
 /**
  *
  * @since 4.0
@@ -48,11 +50,12 @@ public interface DependencyCoordinateFactoryRequest extends 
ArtifactCoordinateFa
     @Nonnull
     Collection<Exclusion> getExclusions();
 
-    static DependencyCoordinateFactoryRequest build( Session session, String 
groupId, String artifactId,
+    @Nonnull
+    static DependencyCoordinateFactoryRequest build( @Nonnull Session session, 
String groupId, String artifactId,
                                                    String version, String 
classifier, String extension, String type )
     {
         return DependencyCoordinateFactoryRequest.builder()
-                .session( session )
+                .session( nonNull( session, "session cannot be null" ) )
                 .groupId( groupId )
                 .artifactId( artifactId )
                 .version( version )
@@ -62,11 +65,12 @@ public interface DependencyCoordinateFactoryRequest extends 
ArtifactCoordinateFa
                 .build();
     }
 
-    static DependencyCoordinateFactoryRequest build( Session session, 
ArtifactCoordinate coordinate )
+    @Nonnull
+    static DependencyCoordinateFactoryRequest build( @Nonnull Session session, 
@Nonnull ArtifactCoordinate coordinate )
     {
         return builder()
-                .session( session )
-                .groupId( coordinate.getGroupId() )
+                .session( nonNull( session, "session cannot be null" ) )
+                .groupId( nonNull( coordinate, "coordinate cannot be null" 
).getGroupId() )
                 .artifactId( coordinate.getArtifactId() )
                 .version( coordinate.getVersion().asString() )
                 .classifier( coordinate.getClassifier() )
@@ -74,11 +78,12 @@ public interface DependencyCoordinateFactoryRequest extends 
ArtifactCoordinateFa
                 .build();
     }
 
-    static DependencyCoordinateFactoryRequest build( Session session, 
Dependency dependency )
+    @Nonnull
+    static DependencyCoordinateFactoryRequest build( @Nonnull Session session, 
@Nonnull Dependency dependency )
     {
         return builder()
-                .session( session )
-                .groupId( dependency.getGroupId() )
+                .session( nonNull( session, "session cannot be null" ) )
+                .groupId( nonNull( dependency, "dependency" ).getGroupId() )
                 .artifactId( dependency.getArtifactId() )
                 .version( dependency.getVersion().asString() )
                 .classifier( dependency.getClassifier() )
@@ -89,6 +94,7 @@ public interface DependencyCoordinateFactoryRequest extends 
ArtifactCoordinateFa
                 .build();
     }
 
+    @Nonnull
     static DependencyCoordinateFactoryRequestBuilder builder()
     {
         return new DependencyCoordinateFactoryRequestBuilder();
@@ -108,6 +114,10 @@ public interface DependencyCoordinateFactoryRequest 
extends ArtifactCoordinateFa
         private boolean optional;
         private Collection<Exclusion> exclusions = Collections.emptyList();
 
+        DependencyCoordinateFactoryRequestBuilder()
+        {
+        }
+
         public DependencyCoordinateFactoryRequestBuilder session( Session 
session )
         {
             this.session = session;
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
index d7829752f..e75ea4af5 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilder.java
@@ -41,7 +41,7 @@ public interface ProjectBuilder extends Service
      *
      * @param request {@link ProjectBuilderRequest}
      * @return the {@link ProjectBuilderResult} containing the built project 
and possible errors
-     * @throws ProjectBuilderException if the project can not be created
+     * @throws ProjectBuilderException if the project cannot be created
      * @throws IllegalArgumentException if an argument is {@code null} or 
invalid
      */
     @Nonnull
@@ -52,7 +52,7 @@ public interface ProjectBuilder extends Service
      *
      * @param session The {@link Session}, must not be {@code null}.
      * @param source The {@link ProjectBuilderSource}, must not be {@code 
null}.
-     * @throws ProjectBuilderException if the project can not be created
+     * @throws ProjectBuilderException if the project cannot be created
      * @throws IllegalArgumentException if an argument is {@code null} or 
invalid
      * @see #build(ProjectBuilderRequest)
      */
@@ -67,7 +67,7 @@ public interface ProjectBuilder extends Service
      *
      * @param session The {@link Session}, must not be {@code null}.
      * @param path The {@link Path}, must not be {@code null}.
-     * @throws ProjectBuilderException if the project can not be created
+     * @throws ProjectBuilderException if the project cannot be created
      * @throws IllegalArgumentException if an argument is {@code null} or 
invalid
      * @see #build(ProjectBuilderRequest)
      */
@@ -82,7 +82,7 @@ public interface ProjectBuilder extends Service
      *
      * @param session The {@link Session}, must not be {@code null}.
      * @param artifact The {@link Artifact}, must not be {@code null}.
-     * @throws ProjectBuilderException if the project can not be created
+     * @throws ProjectBuilderException if the project cannot be created
      * @throws IllegalArgumentException if an argument is {@code null} or 
invalid
      * @see #build(ProjectBuilderRequest)
      */
@@ -97,7 +97,7 @@ public interface ProjectBuilder extends Service
      *
      * @param session The {@link Session}, must not be {@code null}.
      * @param coordinate The {@link ArtifactCoordinate}, must not be {@code 
null}.
-     * @throws ProjectBuilderException if the project can not be created
+     * @throws ProjectBuilderException if the project cannot be created
      * @throws IllegalArgumentException if an argument is {@code null} or 
invalid
      * @see #build(ProjectBuilderRequest)
      */
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
index 4b90e8bfd..2e259091a 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
@@ -72,8 +72,8 @@ public interface ProjectBuilderRequest
     static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull 
ProjectBuilderSource source )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .source( nonNull( source, "source can not be null" ) )
+                .session( nonNull( session, "session cannot be null" ) )
+                .source( nonNull( source, "source cannot be null" ) )
                 .build();
     }
 
@@ -81,8 +81,8 @@ public interface ProjectBuilderRequest
     static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull 
Path path )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .path( nonNull( path, "path can not be null" ) )
+                .session( nonNull( session, "session cannot be null" ) )
+                .path( nonNull( path, "path cannot be null" ) )
                 .build();
     }
 
@@ -90,8 +90,8 @@ public interface ProjectBuilderRequest
     static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull 
Artifact artifact )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .artifact( nonNull( artifact, "artifact can not be null" ) )
+                .session( nonNull( session, "session cannot be null" ) )
+                .artifact( nonNull( artifact, "artifact cannot be null" ) )
                 .build();
     }
 
@@ -99,8 +99,8 @@ public interface ProjectBuilderRequest
     static ProjectBuilderRequest build( @Nonnull Session session, @Nonnull 
ArtifactCoordinate coordinate )
     {
         return builder()
-                .session( nonNull( session, "session can not be null" ) )
-                .coordinate( nonNull( coordinate, "coordinate can not be null" 
) )
+                .session( nonNull( session, "session cannot be null" ) )
+                .coordinate( nonNull( coordinate, "coordinate cannot be null" 
) )
                 .build();
     }
 
@@ -123,6 +123,10 @@ public interface ProjectBuilderRequest
         boolean processPlugins = true;
         boolean resolveDependencies = true;
 
+        ProjectBuilderRequestBuilder()
+        {
+        }
+
         public ProjectBuilderRequestBuilder session( Session session )
         {
             this.session = session;
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlFactory.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlFactory.java
index 651b1a5fe..f3ee6b775 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlFactory.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlFactory.java
@@ -22,6 +22,8 @@ package org.apache.maven.api.services.xml;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.file.Path;
 
@@ -95,4 +97,32 @@ public interface XmlFactory<T> extends Service
 
     void write( @Nonnull XmlWriterRequest<T> request ) throws 
XmlWriterException;
 
+    /**
+     * Simply parse the given xml string.
+     * 
+     * @param xml the input xml string
+     * @return the parsed object
+     * @throws XmlReaderException if an error occurs during the parsing
+     * @see #toXmlString(Object) 
+     */
+    default T fromXmlString( @Nonnull String xml ) throws XmlReaderException
+    {
+        return read( new StringReader( xml ) );
+    }
+    
+    /**
+     * Simply converts the given content to an xml string.
+     * 
+     * @param content the object to convert
+     * @return the xml string representation
+     * @throws XmlWriterException if an error occurs during the transformation
+     * @see #fromXmlString(String) 
+     */
+    default String toXmlString( @Nonnull T content ) throws XmlWriterException
+    {
+        StringWriter sw = new StringWriter();
+        write( content, sw );
+        return sw.toString();
+    }
+    
 }
diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java 
b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index 068b1e696..dd47a2d9a 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -35,6 +35,7 @@ import org.apache.maven.execution.ProjectDependencyGraph;
 import org.apache.maven.graph.GraphBuilder;
 import org.apache.maven.graph.ProjectSelector;
 import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory;
+import org.apache.maven.internal.impl.DefaultSession;
 import org.apache.maven.internal.impl.DefaultSessionFactory;
 import org.apache.maven.lifecycle.LifecycleExecutionException;
 import org.apache.maven.internal.aether.MavenChainedWorkspaceReader;
@@ -240,6 +241,7 @@ public class DefaultMaven
 
             sessionScope.seed( MavenSession.class, session );
             sessionScope.seed( Session.class, session.getSession() );
+            sessionScope.seed( DefaultSession.class, (DefaultSession) 
session.getSession() );
 
             legacySupport.setSession( session );
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactCoordinateFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactCoordinateFactory.java
index b6edcd572..3412c07e7 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactCoordinateFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactCoordinateFactory.java
@@ -20,6 +20,7 @@ package org.apache.maven.internal.impl;
  */
 
 import javax.inject.Named;
+import javax.inject.Singleton;
 
 import org.apache.maven.api.ArtifactCoordinate;
 import org.apache.maven.api.annotations.Nonnull;
@@ -32,6 +33,7 @@ import static org.apache.maven.internal.impl.Utils.cast;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
 @Named
+@Singleton
 public class DefaultArtifactCoordinateFactory implements 
ArtifactCoordinateFactory
 {
     @Override
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactDeployer.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactDeployer.java
index f6be945bf..8a0c45541 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactDeployer.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactDeployer.java
@@ -24,6 +24,7 @@ import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.annotations.Nonnull;
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.inject.Singleton;
 
 import java.util.Collection;
 import java.util.List;
@@ -46,6 +47,7 @@ import static org.apache.maven.internal.impl.Utils.nonNull;
  * Implementation of {@link ArtifactDeployer} service.
  */
 @Named
+@Singleton
 public class DefaultArtifactDeployer implements ArtifactDeployer
 {
     private final @Nonnull RepositorySystem repositorySystem;
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactFactory.java
index c5dd9a1c2..25d98185d 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactFactory.java
@@ -20,6 +20,7 @@ package org.apache.maven.internal.impl;
  */
 
 import javax.inject.Named;
+import javax.inject.Singleton;
 
 import org.apache.maven.api.Artifact;
 import org.apache.maven.api.annotations.Nonnull;
@@ -32,6 +33,7 @@ import static org.apache.maven.internal.impl.Utils.cast;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
 @Named
+@Singleton
 public class DefaultArtifactFactory implements ArtifactFactory
 {
     @Override
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactInstaller.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactInstaller.java
index dba2fa80a..183db6a8a 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactInstaller.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactInstaller.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.api.annotations.Nonnull;
 
 import java.util.Collection;
@@ -38,11 +42,14 @@ import org.eclipse.aether.metadata.Metadata;
 import static org.apache.maven.internal.impl.Utils.cast;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
+@Named
+@Singleton
 public class DefaultArtifactInstaller implements ArtifactInstaller
 {
 
     private final RepositorySystem repositorySystem;
 
+    @Inject
     DefaultArtifactInstaller( @Nonnull RepositorySystem repositorySystem )
     {
         this.repositorySystem = nonNull( repositorySystem );
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
index 69b9f991e..a4b0961d7 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactManager.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.maven.SessionScoped;
 import org.apache.maven.api.annotations.Nonnull;
 
 import java.io.File;
@@ -35,14 +39,17 @@ import org.apache.maven.api.Metadata;
 import org.apache.maven.api.services.ArtifactManager;
 import org.apache.maven.project.MavenProject;
 
+@Named
+@SessionScoped
 public class DefaultArtifactManager implements ArtifactManager
 {
 
     @Nonnull
     private final DefaultSession session;
-    private final Map<Artifact, Path> paths = new ConcurrentHashMap<>();
-    private final Map<Artifact, Collection<Metadata>> metadatas = new 
ConcurrentHashMap<>();
+    private final Map<String, Path> paths = new ConcurrentHashMap<>();
+    private final Map<String, Collection<Metadata>> metadatas = new 
ConcurrentHashMap<>();
 
+    @Inject
     public DefaultArtifactManager( @Nonnull DefaultSession session )
     {
         this.session = session;
@@ -52,9 +59,9 @@ public class DefaultArtifactManager implements ArtifactManager
     @Override
     public Optional<Path> getPath( @Nonnull Artifact artifact )
     {
+        String id = id( artifact );
         if ( session.getMavenSession().getAllProjects() != null )
         {
-            String id = id( artifact );
             for ( MavenProject project : 
session.getMavenSession().getAllProjects() )
             {
                 if ( id.equals( id( project.getArtifact() ) ) && 
project.getArtifact().getFile() != null )
@@ -63,7 +70,7 @@ public class DefaultArtifactManager implements ArtifactManager
                 }
             }
         }
-        Path path = paths.get( artifact );
+        Path path = paths.get( id );
         if ( path == null && artifact instanceof DefaultArtifact )
         {
             File file = ( (DefaultArtifact) artifact ).getArtifact().getFile();
@@ -78,9 +85,9 @@ public class DefaultArtifactManager implements ArtifactManager
     @Override
     public void setPath( @Nonnull Artifact artifact, Path path )
     {
+        String id = id( artifact );
         if ( session.getMavenSession().getAllProjects() != null )
         {
-            String id = id( artifact );
             for ( MavenProject project : 
session.getMavenSession().getAllProjects() )
             {
                 if ( id.equals( id( project.getArtifact() ) ) )
@@ -92,11 +99,11 @@ public class DefaultArtifactManager implements 
ArtifactManager
         }
         if ( path == null )
         {
-            paths.remove( artifact );
+            paths.remove( id );
         }
         else
         {
-            paths.put( artifact, path );
+            paths.put( id, path );
         }
     }
 
@@ -104,14 +111,14 @@ public class DefaultArtifactManager implements 
ArtifactManager
     @Override
     public Collection<Metadata> getAttachedMetadatas( @Nonnull Artifact 
artifact )
     {
-        Collection<Metadata> m = metadatas.get( artifact );
+        Collection<Metadata> m = metadatas.get( id( artifact ) );
         return m != null ? Collections.unmodifiableCollection( m ) : 
Collections.emptyList();
     }
 
     @Override
     public void attachMetadata( @Nonnull Artifact artifact, @Nonnull Metadata 
metadata )
     {
-        metadatas.computeIfAbsent( artifact, a -> new CopyOnWriteArrayList<>() 
).add( metadata );
+        metadatas.computeIfAbsent( id( artifact ), a -> new 
CopyOnWriteArrayList<>() ).add( metadata );
     }
 
     private String id( org.apache.maven.artifact.Artifact artifact )
@@ -126,11 +133,7 @@ public class DefaultArtifactManager implements 
ArtifactManager
 
     private String id( Artifact artifact )
     {
-        return artifact.getGroupId()
-                + ":" + artifact.getArtifactId()
-                + ":" + artifact.getExtension()
-                + ( artifact.getClassifier().isEmpty() ? "" : ":" + 
artifact.getClassifier() )
-                + ":" + artifact.getVersion();
+        return artifact.key();
     }
 
 }
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
index dadb37acd..ac1a163a5 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
@@ -21,6 +21,8 @@ package org.apache.maven.internal.impl;
 
 import org.apache.maven.api.annotations.Nonnull;
 import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 import java.nio.file.Path;
 import java.util.HashMap;
@@ -43,6 +45,8 @@ import org.eclipse.aether.resolution.ArtifactResult;
 import static org.apache.maven.internal.impl.Utils.cast;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
+@Named
+@Singleton
 public class DefaultArtifactResolver implements ArtifactResolver
 {
     private final RepositorySystem repositorySystem;
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCollector.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCollector.java
index 83ea3732a..8cf4b181a 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCollector.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCollector.java
@@ -22,6 +22,7 @@ package org.apache.maven.internal.impl;
 import org.apache.maven.api.annotations.Nonnull;
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.inject.Singleton;
 
 import java.util.List;
 
@@ -45,6 +46,7 @@ import static org.apache.maven.internal.impl.Utils.cast;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
 @Named
+@Singleton
 public class DefaultDependencyCollector implements DependencyCollector
 {
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCoordinateFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCoordinateFactory.java
index ae765e934..06e0da314 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCoordinateFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultDependencyCoordinateFactory.java
@@ -20,6 +20,7 @@ package org.apache.maven.internal.impl;
  */
 
 import javax.inject.Named;
+import javax.inject.Singleton;
 
 import java.util.stream.Collectors;
 
@@ -34,6 +35,7 @@ import static org.apache.maven.internal.impl.Utils.cast;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
 @Named
+@Singleton
 public class DefaultDependencyCoordinateFactory implements 
DependencyCoordinateFactory
 {
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
index 450791df6..ec97dc765 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLocalRepositoryManager.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.nio.file.Path;
 
 import org.apache.maven.api.Artifact;
@@ -28,6 +31,8 @@ import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.services.LocalRepositoryManager;
 
+@Named
+@Singleton
 public class DefaultLocalRepositoryManager implements LocalRepositoryManager
 {
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLookup.java 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLookup.java
index 9df503cd7..1273066f5 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLookup.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLookup.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.List;
 import java.util.Map;
 
@@ -27,11 +31,14 @@ import org.apache.maven.api.services.LookupException;
 import org.codehaus.plexus.PlexusContainer;
 import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
+@Named
+@Singleton
 public class DefaultLookup implements Lookup
 {
 
     private final PlexusContainer container;
 
+    @Inject
     public DefaultLookup( PlexusContainer container )
     {
         this.container = container;
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultMessageBuilderFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultMessageBuilderFactory.java
index 078ca08b1..f04f3087e 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultMessageBuilderFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultMessageBuilderFactory.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.Objects;
 
 import org.apache.maven.api.annotations.Experimental;
@@ -28,6 +31,8 @@ import org.apache.maven.api.services.MessageBuilderFactory;
 import org.apache.maven.shared.utils.logging.MessageUtils;
 
 @Experimental
+@Named
+@Singleton
 public class DefaultMessageBuilderFactory implements MessageBuilderFactory
 {
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultModelXmlFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultModelXmlFactory.java
index c8079351e..ccb69a8b9 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultModelXmlFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultModelXmlFactory.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
@@ -28,19 +31,21 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 
 import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.model.InputSource;
+import org.apache.maven.api.model.Model;
 import org.apache.maven.api.services.xml.ModelXmlFactory;
 import org.apache.maven.api.services.xml.XmlReaderException;
 import org.apache.maven.api.services.xml.XmlReaderRequest;
 import org.apache.maven.api.services.xml.XmlWriterException;
 import org.apache.maven.api.services.xml.XmlWriterRequest;
-import org.apache.maven.api.model.InputSource;
-import org.apache.maven.api.model.Model;
 import org.apache.maven.model.v4.MavenXpp3ReaderEx;
 import org.apache.maven.model.v4.MavenXpp3WriterEx;
 import org.codehaus.plexus.util.ReaderFactory;
 
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
+@Named
+@Singleton
 public class DefaultModelXmlFactory
         implements ModelXmlFactory
 {
@@ -120,4 +125,31 @@ public class DefaultModelXmlFactory
             throw new XmlWriterException( "Unable to write model", e );
         }
     }
+
+    /**
+     * Simply parse the given xml string.
+     *
+     * @param xml the input xml string
+     * @return the parsed object
+     * @throws XmlReaderException if an error occurs during the parsing
+     * @see #toXmlString(Object)
+     */
+    public static Model fromXml( @Nonnull String xml ) throws 
XmlReaderException
+    {
+        return new DefaultModelXmlFactory().fromXmlString( xml );
+    }
+
+    /**
+     * Simply converts the given content to an xml string.
+     *
+     * @param content the object to convert
+     * @return the xml string representation
+     * @throws XmlWriterException if an error occurs during the transformation
+     * @see #fromXmlString(String)
+     */
+    public static String toXml( @Nonnull Model content ) throws 
XmlWriterException
+    {
+        return new DefaultModelXmlFactory().toXmlString( content );
+    }
+
 }
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
index d9911c201..959f8fc69 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
@@ -20,6 +20,8 @@ package org.apache.maven.internal.impl;
  */
 
 import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
 import java.io.File;
 import java.io.IOException;
@@ -52,6 +54,8 @@ import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingResult;
 
+@Named
+@Singleton
 public class DefaultProjectBuilder implements ProjectBuilder
 {
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
index 4a5e62218..6f0855ba9 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectManager.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Collections;
@@ -28,6 +31,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.maven.RepositoryUtils;
+import org.apache.maven.SessionScoped;
 import org.apache.maven.api.Artifact;
 import org.apache.maven.api.Node;
 import org.apache.maven.api.Project;
@@ -45,6 +49,8 @@ import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.PlexusContainer;
 import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
+@Named
+@SessionScoped
 public class DefaultProjectManager implements ProjectManager
 {
 
@@ -52,6 +58,7 @@ public class DefaultProjectManager implements ProjectManager
     private final ArtifactManager artifactManager;
     private final PlexusContainer container;
 
+    @Inject
     public DefaultProjectManager( Session session,
                                   ArtifactManager artifactManager,
                                   PlexusContainer container )
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPrompter.java 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPrompter.java
index e1e87f3e0..2bb642124 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPrompter.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPrompter.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.lang.reflect.Method;
 import java.util.List;
 
@@ -26,12 +30,15 @@ import org.apache.maven.api.services.Prompter;
 import org.apache.maven.api.services.PrompterException;
 import org.codehaus.plexus.PlexusContainer;
 
+@Named
+@Singleton
 public class DefaultPrompter implements Prompter
 {
 
     private static final String PROMPTER_CLASS = 
"org.codehaus.plexus.components.interactivity.Prompter";
     private final PlexusContainer container;
 
+    @Inject
     public DefaultPrompter( PlexusContainer container )
     {
         this.container = container;
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
index c61774c5f..e3abff1db 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultRepositoryFactory.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.nio.file.Path;
 
 import org.apache.maven.api.LocalRepository;
@@ -28,11 +32,14 @@ import org.apache.maven.api.model.Repository;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.repository.RepositoryPolicy;
 
+@Named
+@Singleton
 public class DefaultRepositoryFactory implements RepositoryFactory
 {
 
     private final RepositorySystem repositorySystem;
 
+    @Inject
     public DefaultRepositoryFactory( RepositorySystem repositorySystem )
     {
         this.repositorySystem = repositorySystem;
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java
index 12af08d6e..6d5b7c6ef 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java
@@ -41,39 +41,15 @@ import org.apache.maven.api.Session;
 import org.apache.maven.api.SessionData;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.Nullable;
-import org.apache.maven.api.services.ArtifactDeployer;
-import org.apache.maven.api.services.ArtifactFactory;
-import org.apache.maven.api.services.ArtifactInstaller;
-import org.apache.maven.api.services.ArtifactManager;
-import org.apache.maven.api.services.ArtifactResolver;
-import org.apache.maven.api.services.ArtifactCoordinateFactory;
-import org.apache.maven.api.services.DependencyCollector;
-import org.apache.maven.api.services.DependencyCoordinateFactory;
-import org.apache.maven.api.services.LocalRepositoryManager;
-import org.apache.maven.api.services.Lookup;
 import org.apache.maven.api.services.MavenException;
-import org.apache.maven.api.services.MessageBuilderFactory;
-import org.apache.maven.api.services.ProjectBuilder;
-import org.apache.maven.api.services.ProjectManager;
-import org.apache.maven.api.services.Prompter;
-import org.apache.maven.api.services.RepositoryFactory;
-import org.apache.maven.api.services.ToolchainManager;
-import org.apache.maven.api.services.TypeRegistry;
-import org.apache.maven.api.services.VersionParser;
-import org.apache.maven.api.services.xml.ModelXmlFactory;
-import org.apache.maven.api.services.xml.SettingsXmlFactory;
-import org.apache.maven.api.services.xml.ToolchainsXmlFactory;
 import org.apache.maven.api.settings.Settings;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.bridge.MavenRepositorySystem;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.execution.scope.internal.MojoExecutionScope;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.rtinfo.RuntimeInformation;
-import org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
 import org.codehaus.plexus.PlexusContainer;
 import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.eclipse.aether.DefaultRepositorySystemSession;
@@ -89,26 +65,18 @@ public class DefaultSession extends AbstractSession
     private final RepositorySystemSession session;
     private final RepositorySystem repositorySystem;
     private final List<RemoteRepository> repositories;
-    private final org.apache.maven.project.ProjectBuilder projectBuilder;
     private final MavenRepositorySystem mavenRepositorySystem;
-    private final DefaultToolchainManagerPrivate toolchainManagerPrivate;
     private final PlexusContainer container;
-    private final MojoExecutionScope mojoExecutionScope;
     private final RuntimeInformation runtimeInformation;
-    private final ArtifactHandlerManager artifactHandlerManager;
     private final Map<Class<? extends Service>, Service> services = new 
HashMap<>();
 
     @SuppressWarnings( "checkstyle:ParameterNumber" )
     public DefaultSession( @Nonnull MavenSession session,
                            @Nonnull RepositorySystem repositorySystem,
                            @Nullable List<RemoteRepository> repositories,
-                           @Nonnull org.apache.maven.project.ProjectBuilder 
projectBuilder,
                            @Nonnull MavenRepositorySystem 
mavenRepositorySystem,
-                           @Nonnull DefaultToolchainManagerPrivate 
toolchainManagerPrivate,
                            @Nonnull PlexusContainer container,
-                           @Nonnull MojoExecutionScope mojoExecutionScope,
-                           @Nonnull RuntimeInformation runtimeInformation,
-                           @Nonnull ArtifactHandlerManager 
artifactHandlerManager )
+                           @Nonnull RuntimeInformation runtimeInformation )
     {
         this.mavenSession = nonNull( session );
         this.session = mavenSession.getRepositorySession();
@@ -117,38 +85,9 @@ public class DefaultSession extends AbstractSession
                 ? repositories
                 : mavenSession.getRequest().getRemoteRepositories().stream()
                 .map( RepositoryUtils::toRepo ).map( this::getRemoteRepository 
).collect( Collectors.toList() );
-        this.projectBuilder = projectBuilder;
         this.mavenRepositorySystem = mavenRepositorySystem;
-        this.toolchainManagerPrivate = toolchainManagerPrivate;
         this.container = container;
-        this.mojoExecutionScope = mojoExecutionScope;
         this.runtimeInformation = runtimeInformation;
-        this.artifactHandlerManager = artifactHandlerManager;
-
-        ArtifactManager artifactManager = new DefaultArtifactManager( this );
-        ProjectManager projectManager = new DefaultProjectManager( this, 
artifactManager, container );
-
-        services.put( ArtifactFactory.class, new DefaultArtifactFactory() );
-        services.put( ArtifactResolver.class, new DefaultArtifactResolver( 
repositorySystem ) );
-        services.put( ArtifactDeployer.class, new DefaultArtifactDeployer( 
repositorySystem ) );
-        services.put( ArtifactInstaller.class, new DefaultArtifactInstaller( 
repositorySystem ) );
-        services.put( ArtifactManager.class, artifactManager );
-        services.put( DependencyCoordinateFactory.class, new 
DefaultDependencyCoordinateFactory() );
-        services.put( DependencyCollector.class, new 
DefaultDependencyCollector( repositorySystem ) );
-        services.put( ProjectBuilder.class, new DefaultProjectBuilder( 
projectBuilder ) );
-        services.put( ProjectManager.class, projectManager );
-        services.put( LocalRepositoryManager.class, new 
DefaultLocalRepositoryManager() );
-        services.put( RepositoryFactory.class, new DefaultRepositoryFactory( 
repositorySystem ) );
-        services.put( ToolchainManager.class, new DefaultToolchainManager( 
toolchainManagerPrivate ) );
-        services.put( ModelXmlFactory.class, new DefaultModelXmlFactory() );
-        services.put( SettingsXmlFactory.class, new 
DefaultSettingsXmlFactory() );
-        services.put( ToolchainsXmlFactory.class, new 
DefaultToolchainsXmlFactory() );
-        services.put( Prompter.class, new DefaultPrompter( container ) );
-        services.put( MessageBuilderFactory.class, new 
DefaultMessageBuilderFactory() );
-        services.put( VersionParser.class, new DefaultVersionParser() );
-        services.put( ArtifactCoordinateFactory.class, new 
DefaultArtifactCoordinateFactory() );
-        services.put( TypeRegistry.class, new DefaultTypeRegistry( 
artifactHandlerManager ) );
-        services.put( Lookup.class, new DefaultLookup( container ) );
     }
 
     public MavenSession getMavenSession()
@@ -304,16 +243,16 @@ public class DefaultSession extends AbstractSession
                 .setLocalRepositoryManager( localRepositoryManager );
         MavenSession newSession = new MavenSession( 
mavenSession.getContainer(), repoSession,
                 mavenSession.getRequest(), mavenSession.getResult() );
-        return new DefaultSession( newSession, repositorySystem, repositories, 
projectBuilder, mavenRepositorySystem,
-                toolchainManagerPrivate, container, mojoExecutionScope, 
runtimeInformation, artifactHandlerManager );
+        return new DefaultSession( newSession, repositorySystem, repositories,
+                mavenRepositorySystem, container, runtimeInformation );
     }
 
     @Nonnull
     @Override
     public Session withRemoteRepositories( @Nonnull List<RemoteRepository> 
repositories )
     {
-        return new DefaultSession( mavenSession, repositorySystem, 
repositories, projectBuilder, mavenRepositorySystem,
-                toolchainManagerPrivate, container, mojoExecutionScope, 
runtimeInformation, artifactHandlerManager );
+        return new DefaultSession( mavenSession, repositorySystem, 
repositories,
+                mavenRepositorySystem, container, runtimeInformation );
     }
 
     @Nonnull
@@ -321,7 +260,7 @@ public class DefaultSession extends AbstractSession
     @SuppressWarnings( "unchecked" )
     public <T extends Service> T getService( Class<T> clazz ) throws 
NoSuchElementException
     {
-        T t = (T) services.get( clazz );
+        T t = (T) services.computeIfAbsent( clazz, this::lookup );
         if ( t == null )
         {
             throw new NoSuchElementException( clazz.getName() );
@@ -329,6 +268,20 @@ public class DefaultSession extends AbstractSession
         return t;
     }
 
+    private Service lookup( Class<? extends Service> c )
+    {
+        try
+        {
+            return container.lookup( c );
+        }
+        catch ( ComponentLookupException e )
+        {
+            NoSuchElementException nsee = new NoSuchElementException( 
c.getName() );
+            e.initCause( e );
+            throw nsee;
+        }
+    }
+
     @Nonnull
     public RepositorySystemSession getSession()
     {
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSessionFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSessionFactory.java
index 4816006ab..b0cb18d76 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSessionFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSessionFactory.java
@@ -24,13 +24,9 @@ import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.apache.maven.api.Session;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.bridge.MavenRepositorySystem;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.execution.scope.internal.MojoExecutionScope;
-import org.apache.maven.project.ProjectBuilder;
 import org.apache.maven.rtinfo.RuntimeInformation;
-import org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
 import org.codehaus.plexus.PlexusContainer;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.SessionData;
@@ -40,33 +36,21 @@ import org.eclipse.aether.SessionData;
 public class DefaultSessionFactory
 {
     private final RepositorySystem repositorySystem;
-    private final org.apache.maven.project.ProjectBuilder projectBuilder;
     private final MavenRepositorySystem mavenRepositorySystem;
-    private final DefaultToolchainManagerPrivate toolchainManagerPrivate;
     private final PlexusContainer plexusContainer;
-    private final MojoExecutionScope mojoExecutionScope;
     private final RuntimeInformation runtimeInformation;
-    private final ArtifactHandlerManager artifactHandlerManager;
 
     @Inject
     @SuppressWarnings( "checkstyle:ParameterNumber" )
     public DefaultSessionFactory( RepositorySystem repositorySystem,
-                                  ProjectBuilder projectBuilder,
                                   MavenRepositorySystem mavenRepositorySystem,
-                                  DefaultToolchainManagerPrivate 
toolchainManagerPrivate,
                                   PlexusContainer plexusContainer,
-                                  MojoExecutionScope mojoExecutionScope,
-                                  RuntimeInformation runtimeInformation,
-                                  ArtifactHandlerManager 
artifactHandlerManager )
+                                  RuntimeInformation runtimeInformation )
     {
         this.repositorySystem = repositorySystem;
-        this.projectBuilder = projectBuilder;
         this.mavenRepositorySystem = mavenRepositorySystem;
-        this.toolchainManagerPrivate = toolchainManagerPrivate;
         this.plexusContainer = plexusContainer;
-        this.mojoExecutionScope = mojoExecutionScope;
         this.runtimeInformation = runtimeInformation;
-        this.artifactHandlerManager = artifactHandlerManager;
     }
 
     public Session getSession( MavenSession mavenSession )
@@ -78,8 +62,7 @@ public class DefaultSessionFactory
     private Session newSession( MavenSession mavenSession )
     {
         return new DefaultSession(
-                mavenSession, repositorySystem, null, projectBuilder, 
mavenRepositorySystem,
-                toolchainManagerPrivate, plexusContainer, mojoExecutionScope, 
runtimeInformation,
-                artifactHandlerManager );
+                mavenSession, repositorySystem, null,
+                mavenRepositorySystem, plexusContainer, runtimeInformation );
     }
 }
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSettingsXmlFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSettingsXmlFactory.java
index ee0329fcb..a1f636a0e 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSettingsXmlFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSettingsXmlFactory.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
@@ -36,6 +39,8 @@ import org.apache.maven.api.settings.Settings;
 import org.apache.maven.settings.v4.SettingsXpp3Reader;
 import org.apache.maven.settings.v4.SettingsXpp3Writer;
 
+@Named
+@Singleton
 public class DefaultSettingsXmlFactory
         implements SettingsXmlFactory
 {
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainManager.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainManager.java
index f40de6585..5348c4841 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainManager.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -33,10 +37,13 @@ import 
org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
 import org.apache.maven.toolchain.MisconfiguredToolchainException;
 import org.apache.maven.toolchain.ToolchainPrivate;
 
+@Named
+@Singleton
 public class DefaultToolchainManager implements ToolchainManager
 {
     private final DefaultToolchainManagerPrivate toolchainManagerPrivate;
 
+    @Inject
     public DefaultToolchainManager( DefaultToolchainManagerPrivate 
toolchainManagerPrivate )
     {
         this.toolchainManagerPrivate = toolchainManagerPrivate;
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsXmlFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsXmlFactory.java
index 33e6db4a7..21b499c79 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsXmlFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultToolchainsXmlFactory.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
@@ -36,6 +39,9 @@ import org.apache.maven.api.toolchain.PersistedToolchains;
 import org.apache.maven.toolchain.v4.MavenToolchainsXpp3Reader;
 import org.apache.maven.toolchain.v4.MavenToolchainsXpp3Writer;
 
+
+@Named
+@Singleton
 public class DefaultToolchainsXmlFactory
         implements ToolchainsXmlFactory
 {
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultTypeRegistry.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultTypeRegistry.java
index c302752f8..691e64588 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultTypeRegistry.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultTypeRegistry.java
@@ -19,6 +19,10 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.api.Type;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.services.TypeRegistry;
@@ -27,11 +31,14 @@ import 
org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
+@Named
+@Singleton
 public class DefaultTypeRegistry implements TypeRegistry
 {
 
     private final ArtifactHandlerManager manager;
 
+    @Inject
     public DefaultTypeRegistry( ArtifactHandlerManager manager )
     {
         this.manager = nonNull( manager, "artifactHandlerManager" );
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultVersionParser.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultVersionParser.java
index 03762c997..9ea1cb209 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultVersionParser.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultVersionParser.java
@@ -19,6 +19,9 @@ package org.apache.maven.internal.impl;
  * under the License.
  */
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import java.util.Objects;
 import java.util.regex.Pattern;
 
@@ -33,6 +36,8 @@ import 
org.apache.maven.artifact.versioning.InvalidVersionSpecificationException
 import static 
org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec;
 import static org.apache.maven.internal.impl.Utils.nonNull;
 
+@Named
+@Singleton
 public class DefaultVersionParser implements VersionParser
 {
     private static final String SNAPSHOT = "SNAPSHOT";
diff --git 
a/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScopeModule.java
 
b/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScopeModule.java
index ba93ad919..650fd512d 100644
--- 
a/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScopeModule.java
+++ 
b/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScopeModule.java
@@ -25,6 +25,7 @@ import javax.inject.Named;
 import org.apache.maven.SessionScoped;
 import org.apache.maven.api.Session;
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.internal.impl.DefaultSession;
 import org.codehaus.plexus.PlexusContainer;
 import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
@@ -64,5 +65,6 @@ public class SessionScopeModule
 
         bind( MavenSession.class ).toProvider( 
SessionScope.seededKeyProvider() ).in( scope );
         bind( Session.class ).toProvider( SessionScope.seededKeyProvider() 
).in( scope );
+        bind( DefaultSession.class ).toProvider( 
SessionScope.seededKeyProvider() ).in( scope );
     }
 }
diff --git 
a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
 
b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
index e8327783d..4bd6acb35 100644
--- 
a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
+++ 
b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
@@ -19,16 +19,16 @@ package org.apache.maven;
  * under the License.
  */
 
+import javax.inject.Inject;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.InvalidRepositoryException;
-import org.apache.maven.artifact.handler.manager.DefaultArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.execution.DefaultMavenExecutionRequest;
 import org.apache.maven.execution.DefaultMavenExecutionResult;
@@ -47,16 +47,14 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.repository.RepositorySystem;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
-import org.codehaus.plexus.testing.PlexusTest;
 import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.testing.PlexusTest;
 import org.codehaus.plexus.util.FileUtils;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
 import org.eclipse.aether.repository.LocalRepository;
 
-import javax.inject.Inject;
-
 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
 
 @PlexusTest
@@ -74,7 +72,8 @@ public abstract class AbstractCoreMavenComponentTestCase
 
     abstract protected String getProjectsDirectory();
 
-    protected PlexusContainer getContainer() {
+    protected PlexusContainer getContainer()
+    {
         return container;
     }
 
@@ -144,10 +143,10 @@ public abstract class AbstractCoreMavenComponentTestCase
             projects.add( project );
             if ( includeModules )
             {
-                for( String module : project.getModules() )
+                for ( String module : project.getModules() )
                 {
                     File modulePom = new File( pom.getParentFile(), module );
-                    if( modulePom.isDirectory() )
+                    if ( modulePom.isDirectory() )
                     {
                         modulePom = new File( modulePom, "pom.xml" );
                     }
@@ -171,8 +170,7 @@ public abstract class AbstractCoreMavenComponentTestCase
         session.setProjects( projects );
         session.setAllProjects( session.getProjects() );
         session.setSession( new DefaultSession( session, new 
DefaultRepositorySystem(), null,
-                null, null, null, null, null,
-                null, new DefaultArtifactHandlerManager( 
Collections.emptyMap() ) ) );
+                null, null, null ) );
 
         return session;
     }
@@ -245,7 +243,7 @@ public abstract class AbstractCoreMavenComponentTestCase
             model.setGroupId( groupId );
             model.setArtifactId( artifactId );
             model.setVersion( version );
-            model.setBuild(  new Build() );
+            model.setBuild( new Build() );
             project = new MavenProject( model );
         }
 
@@ -271,20 +269,23 @@ public abstract class AbstractCoreMavenComponentTestCase
         //
         public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope )
         {
-            return addDependency( groupId, artifactId, version, scope, 
(Exclusion)null );
+            return addDependency( groupId, artifactId, version, scope, 
(Exclusion) null );
         }
 
-        public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope, Exclusion exclusion )
+        public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope,
+                                             Exclusion exclusion )
         {
             return addDependency( groupId, artifactId, version, scope, null, 
exclusion );
         }
 
-        public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope, String systemPath )
+        public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope,
+                                             String systemPath )
         {
             return addDependency( groupId, artifactId, version, scope, 
systemPath, null );
         }
 
-        public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope, String systemPath, Exclusion 
exclusion )
+        public ProjectBuilder addDependency( String groupId, String 
artifactId, String version, String scope,
+                                             String systemPath, Exclusion 
exclusion )
         {
             Dependency d = new Dependency();
             d.setGroupId( groupId );
@@ -292,7 +293,7 @@ public abstract class AbstractCoreMavenComponentTestCase
             d.setVersion( version );
             d.setScope( scope );
 
-            if ( systemPath != null && scope.equals(  Artifact.SCOPE_SYSTEM ) )
+            if ( systemPath != null && scope.equals( Artifact.SCOPE_SYSTEM ) )
             {
                 d.setSystemPath( systemPath );
             }
diff --git 
a/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java 
b/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
index f707b5439..b39cc21a8 100644
--- a/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
+++ b/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
@@ -25,20 +25,21 @@ import java.nio.file.Path;
 import java.util.Collections;
 import java.util.Optional;
 
+import org.apache.maven.api.Artifact;
 import org.apache.maven.api.ArtifactCoordinate;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.execution.DefaultMavenExecutionRequest;
-import org.apache.maven.execution.MavenSession;
+import org.apache.maven.api.Node;
 import org.apache.maven.api.Project;
 import org.apache.maven.api.Session;
-import org.apache.maven.api.Artifact;
-import org.apache.maven.api.Node;
 import org.apache.maven.api.services.ProjectBuilder;
 import org.apache.maven.api.services.ProjectBuilderRequest;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.bridge.MavenRepositorySystem;
+import org.apache.maven.execution.DefaultMavenExecutionRequest;
+import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.scope.internal.MojoExecutionScope;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.apache.maven.rtinfo.RuntimeInformation;
+import org.apache.maven.session.scope.internal.SessionScope;
 import org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.testing.PlexusTest;
@@ -49,9 +50,7 @@ import org.eclipse.aether.repository.RemoteRepository;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNotSame;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @PlexusTest
@@ -84,6 +83,9 @@ public class TestApi
     @Inject
     ArtifactHandlerManager artifactHandlerManager;
 
+    @Inject
+    SessionScope sessionScope;
+
     @BeforeEach
     void setup()
     {
@@ -91,10 +93,10 @@ public class TestApi
         DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest();
         MavenSession ms = new MavenSession( null, rss, mer, null );
         DefaultSession session = new DefaultSession( ms, repositorySystem,
-                                                     Collections.emptyList(), 
projectBuilder,
-                                                     mavenRepositorySystem, 
toolchainManagerPrivate,
-                                                     plexusContainer, 
mojoExecutionScope, runtimeInformation,
-                                                     artifactHandlerManager );
+                                                     Collections.emptyList(),
+                                                     mavenRepositorySystem,
+                                                     plexusContainer,
+                                                     runtimeInformation );
         DefaultLocalRepository localRepository = new DefaultLocalRepository(
                 new LocalRepository( "target/test-classes/apiv4-repo" ) );
         org.apache.maven.api.RemoteRepository remoteRepository = 
session.getRemoteRepository(
@@ -103,14 +105,18 @@ public class TestApi
         this.session = session
                 .withLocalRepository( localRepository )
                 .withRemoteRepositories( Collections.singletonList( 
remoteRepository ) );
+
+        sessionScope.enter();
+        sessionScope.seed( DefaultSession.class, (DefaultSession) this.session 
);
     }
 
     @Test
     void testCreateAndResolveArtifact() throws Exception
     {
-        ArtifactCoordinate coord = session.createArtifactCoordinate( 
"org.codehaus.plexus", "plexus-utils", "1.4.5", "pom" );
+        ArtifactCoordinate coord =
+                session.createArtifactCoordinate( "org.codehaus.plexus", 
"plexus-utils", "1.4.5", "pom" );
 
-        Artifact resolved =  session.resolveArtifact( coord );
+        Artifact resolved = session.resolveArtifact( coord );
         Optional<Path> op = session.getArtifactPath( resolved );
         assertTrue( op.isPresent() );
         assertNotNull( op.get() );
@@ -121,7 +127,8 @@ public class TestApi
                 .getProject().get();
         assertNotNull( project );
 
-        Artifact artifact = session.createArtifact( "org.codehaus.plexus", 
"plexus-container-default", "1.0-alpha-32", "jar" );
+        Artifact artifact =
+                session.createArtifact( "org.codehaus.plexus", 
"plexus-container-default", "1.0-alpha-32", "jar" );
         Node root = session.collectDependencies( artifact );
         assertNotNull( root );
     }

Reply via email to