You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kh...@apache.org on 2015/10/13 21:52:50 UTC

[1/5] maven git commit: Bumping version to 3.2.6-SNAPSHOT

Repository: maven
Updated Branches:
  refs/heads/maven-3.2.6 [created] ca8501434


Bumping version to 3.2.6-SNAPSHOT


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/13b89644
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/13b89644
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/13b89644

Branch: refs/heads/maven-3.2.6
Commit: 13b89644cde755f923b3ac676609bcf7aa2e20f1
Parents: 12a6b3a
Author: Karl Heinz Marbaise <kh...@apache.org>
Authored: Mon Oct 12 22:47:04 2015 +0200
Committer: Karl Heinz Marbaise <kh...@apache.org>
Committed: Mon Oct 12 22:47:04 2015 +0200

----------------------------------------------------------------------
 apache-maven/pom.xml              | 2 +-
 maven-aether-provider/pom.xml     | 2 +-
 maven-artifact/pom.xml            | 2 +-
 maven-compat/pom.xml              | 2 +-
 maven-core/pom.xml                | 2 +-
 maven-embedder/pom.xml            | 2 +-
 maven-model-builder/pom.xml       | 2 +-
 maven-model/pom.xml               | 2 +-
 maven-plugin-api/pom.xml          | 2 +-
 maven-repository-metadata/pom.xml | 2 +-
 maven-settings-builder/pom.xml    | 2 +-
 maven-settings/pom.xml            | 2 +-
 pom.xml                           | 2 +-
 13 files changed, 13 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/apache-maven/pom.xml
----------------------------------------------------------------------
diff --git a/apache-maven/pom.xml b/apache-maven/pom.xml
index ea17d67..9c20bc6 100644
--- a/apache-maven/pom.xml
+++ b/apache-maven/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>apache-maven</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-aether-provider/pom.xml
----------------------------------------------------------------------
diff --git a/maven-aether-provider/pom.xml b/maven-aether-provider/pom.xml
index 14a2d4d..07e8322 100644
--- a/maven-aether-provider/pom.xml
+++ b/maven-aether-provider/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-aether-provider</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-artifact/pom.xml
----------------------------------------------------------------------
diff --git a/maven-artifact/pom.xml b/maven-artifact/pom.xml
index c1b2465..56afb02 100644
--- a/maven-artifact/pom.xml
+++ b/maven-artifact/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-artifact</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-compat/pom.xml
----------------------------------------------------------------------
diff --git a/maven-compat/pom.xml b/maven-compat/pom.xml
index 6b771c4..0897068 100644
--- a/maven-compat/pom.xml
+++ b/maven-compat/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-compat</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-core/pom.xml
----------------------------------------------------------------------
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index 1dfccab..ca612dd 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-core</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-embedder/pom.xml
----------------------------------------------------------------------
diff --git a/maven-embedder/pom.xml b/maven-embedder/pom.xml
index f619c92..a8cd630 100644
--- a/maven-embedder/pom.xml
+++ b/maven-embedder/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-embedder</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-model-builder/pom.xml
----------------------------------------------------------------------
diff --git a/maven-model-builder/pom.xml b/maven-model-builder/pom.xml
index a75c746..2b2bffd 100644
--- a/maven-model-builder/pom.xml
+++ b/maven-model-builder/pom.xml
@@ -16,7 +16,7 @@
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-model-builder</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-model/pom.xml
----------------------------------------------------------------------
diff --git a/maven-model/pom.xml b/maven-model/pom.xml
index 6f0b607..74a7943 100644
--- a/maven-model/pom.xml
+++ b/maven-model/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-model</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-plugin-api/pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugin-api/pom.xml b/maven-plugin-api/pom.xml
index 42a9f0c..0e837bd 100644
--- a/maven-plugin-api/pom.xml
+++ b/maven-plugin-api/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-plugin-api</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-repository-metadata/pom.xml
----------------------------------------------------------------------
diff --git a/maven-repository-metadata/pom.xml b/maven-repository-metadata/pom.xml
index a421b81..fd1508e 100644
--- a/maven-repository-metadata/pom.xml
+++ b/maven-repository-metadata/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-repository-metadata</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-settings-builder/pom.xml
----------------------------------------------------------------------
diff --git a/maven-settings-builder/pom.xml b/maven-settings-builder/pom.xml
index e71c996..46d8156 100644
--- a/maven-settings-builder/pom.xml
+++ b/maven-settings-builder/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-settings-builder</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/maven-settings/pom.xml
----------------------------------------------------------------------
diff --git a/maven-settings/pom.xml b/maven-settings/pom.xml
index 9c0eae6..dd3924c 100644
--- a/maven-settings/pom.xml
+++ b/maven-settings/pom.xml
@@ -25,7 +25,7 @@ under the License.
   <parent>
     <groupId>org.apache.maven</groupId>
     <artifactId>maven</artifactId>
-    <version>3.2.5</version>
+    <version>3.2.6-SNAPSHOT</version>
   </parent>
 
   <artifactId>maven-settings</artifactId>

http://git-wip-us.apache.org/repos/asf/maven/blob/13b89644/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 3efab93..e159f69 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
   </parent>
 
   <artifactId>maven</artifactId>
-  <version>3.2.5</version>
+  <version>3.2.6-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>Apache Maven</name>


[4/5] maven git commit: Fixed apache-rat-plugin issues.

Posted by kh...@apache.org.
Fixed apache-rat-plugin issues.


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/7f77f967
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/7f77f967
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/7f77f967

Branch: refs/heads/maven-3.2.6
Commit: 7f77f967789271992226e25219213a8c1ba3d992
Parents: a670e90
Author: Karl Heinz Marbaise <kh...@apache.org>
Authored: Mon Oct 12 22:56:07 2015 +0200
Committer: Karl Heinz Marbaise <kh...@apache.org>
Committed: Mon Oct 12 22:56:07 2015 +0200

----------------------------------------------------------------------
 pom.xml | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/7f77f967/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e159f69..ae5ed13 100644
--- a/pom.xml
+++ b/pom.xml
@@ -449,7 +449,11 @@
           <groupId>org.apache.rat</groupId>
           <artifactId>apache-rat-plugin</artifactId>
           <configuration>
-            <excludes>
+            <excludes combine.children="merge">
+              <exclude>**/.settings/**</exclude>
+              <exclude>**/.project</exclude>
+              <exclude>**/.classpath</exclude>
+              <exclude>**/target/**</exclude>
               <exclude>src/test/resources*/**</exclude>
               <exclude>src/test/projects/**</exclude>
               <exclude>src/test/remote-repo/**</exclude>


[5/5] maven git commit: MNG-5793 do not register same realm both with plugin and extensions realm caches

Posted by kh...@apache.org.
MNG-5793 do not register same realm both with plugin and extensions realm caches

Signed-off-by: Igor Fedorenko <if...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/ca850143
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/ca850143
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/ca850143

Branch: refs/heads/maven-3.2.6
Commit: ca8501434896ec1852a651b403e4ea70579d1310
Parents: 7f77f96
Author: Igor Fedorenko <if...@apache.org>
Authored: Wed Mar 25 15:39:27 2015 -0400
Committer: Karl Heinz Marbaise <kh...@apache.org>
Committed: Mon Oct 12 22:57:10 2015 +0200

----------------------------------------------------------------------
 .../internal/DefaultMavenPluginManager.java     | 113 ++++++++++---------
 1 file changed, 58 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/ca850143/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index 5704276..869fa81 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -333,35 +333,63 @@ public class DefaultMavenPluginManager
         throws PluginResolutionException, PluginContainerException
     {
         Plugin plugin = pluginDescriptor.getPlugin();
-
         MavenProject project = session.getCurrentProject();
 
-        Map<String, ClassLoader> foreignImports = calcImports( project, parent, imports );
-
-        PluginRealmCache.Key cacheKey =
-            pluginRealmCache.createKey( plugin, parent, foreignImports, filter, project.getRemotePluginRepositories(),
-                                        session.getRepositorySession() );
+        if ( plugin.isExtensions() )
+        {
+            ExtensionRealmCache.CacheRecord extensionRecord;
+            try
+            {
+                RepositorySystemSession repositorySession = session.getRepositorySession();
+                extensionRecord = setupExtensionsRealm( project, plugin, repositorySession );
+            }
+            catch ( PluginManagerException e )
+            {
+                // extensions realm is expected to be fully setup at this point
+                // any exception means a problem in maven code, not a user error
+                throw new IllegalStateException( e );
+            }
 
-        PluginRealmCache.CacheRecord cacheRecord = pluginRealmCache.get( cacheKey );
+            ClassRealm pluginRealm = extensionRecord.realm;
+            List<Artifact> pluginArtifacts = extensionRecord.artifacts;
 
-        if ( cacheRecord != null )
-        {
-            pluginDescriptor.setClassRealm( cacheRecord.realm );
-            pluginDescriptor.setArtifacts( new ArrayList<Artifact>( cacheRecord.artifacts ) );
             for ( ComponentDescriptor<?> componentDescriptor : pluginDescriptor.getComponents() )
             {
-                componentDescriptor.setRealm( cacheRecord.realm );
+                componentDescriptor.setRealm( pluginRealm );
             }
+
+            pluginDescriptor.setClassRealm( pluginRealm );
+            pluginDescriptor.setArtifacts( pluginArtifacts );
         }
         else
         {
-            createPluginRealm( pluginDescriptor, session, parent, foreignImports, filter );
+            Map<String, ClassLoader> foreignImports = calcImports( project, parent, imports );
 
-            cacheRecord =
-                pluginRealmCache.put( cacheKey, pluginDescriptor.getClassRealm(), pluginDescriptor.getArtifacts() );
-        }
+            PluginRealmCache.Key cacheKey =
+                pluginRealmCache.createKey( plugin, parent, foreignImports, filter,
+                                            project.getRemotePluginRepositories(), session.getRepositorySession() );
+
+            PluginRealmCache.CacheRecord cacheRecord = pluginRealmCache.get( cacheKey );
+
+            if ( cacheRecord != null )
+            {
+                pluginDescriptor.setClassRealm( cacheRecord.realm );
+                pluginDescriptor.setArtifacts( new ArrayList<Artifact>( cacheRecord.artifacts ) );
+                for ( ComponentDescriptor<?> componentDescriptor : pluginDescriptor.getComponents() )
+                {
+                    componentDescriptor.setRealm( cacheRecord.realm );
+                }
+            }
+            else
+            {
+                createPluginRealm( pluginDescriptor, session, parent, foreignImports, filter );
 
-        pluginRealmCache.register( project, cacheKey, cacheRecord );
+                cacheRecord =
+                    pluginRealmCache.put( cacheKey, pluginDescriptor.getClassRealm(), pluginDescriptor.getArtifacts() );
+            }
+
+            pluginRealmCache.register( project, cacheKey, cacheRecord );
+        }
     }
 
     private void createPluginRealm( PluginDescriptor pluginDescriptor, MavenSession session, ClassLoader parent,
@@ -388,49 +416,24 @@ public class DefaultMavenPluginManager
         final List<Artifact> pluginArtifacts;
 
         RepositorySystemSession repositorySession = session.getRepositorySession();
-        if ( plugin.isExtensions() )
-        {
-            ExtensionRealmCache.CacheRecord extensionRecord;
-            try
-            {
-                extensionRecord = setupExtensionsRealm( project, plugin, repositorySession );
-            }
-            catch ( PluginManagerException e )
-            {
-                // extensions realm is expected to be fully setup at this point
-                // any exception means a problem in maven code, not a user error
-                throw new IllegalStateException( e );
-            }
-
-            pluginRealm = extensionRecord.realm;
-            pluginArtifacts = extensionRecord.artifacts;
-
-            for ( ComponentDescriptor<?> componentDescriptor : pluginDescriptor.getComponents() )
-            {
-                componentDescriptor.setRealm( pluginRealm );
-            }
-        }
-        else
-        {
-            DependencyFilter dependencyFilter = project.getExtensionDependencyFilter();
-            dependencyFilter = AndDependencyFilter.newInstance( dependencyFilter, filter );
+        DependencyFilter dependencyFilter = project.getExtensionDependencyFilter();
+        dependencyFilter = AndDependencyFilter.newInstance( dependencyFilter, filter );
 
-            DependencyNode root =
-                pluginDependenciesResolver.resolve( plugin, RepositoryUtils.toArtifact( pluginArtifact ),
-                                                    dependencyFilter, project.getRemotePluginRepositories(),
-                                                    repositorySession );
+        DependencyNode root =
+            pluginDependenciesResolver.resolve( plugin, RepositoryUtils.toArtifact( pluginArtifact ),
+                                                dependencyFilter, project.getRemotePluginRepositories(),
+                                                repositorySession );
 
-            PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
-            root.accept( nlg );
+        PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+        root.accept( nlg );
 
-            pluginArtifacts = toMavenArtifacts( root, nlg );
+        pluginArtifacts = toMavenArtifacts( root, nlg );
 
-            pluginRealm =
-                classRealmManager.createPluginRealm( plugin, parent, null, foreignImports,
-                                                     toAetherArtifacts( pluginArtifacts ) );
+        pluginRealm =
+            classRealmManager.createPluginRealm( plugin, parent, null, foreignImports,
+                                                 toAetherArtifacts( pluginArtifacts ) );
 
-            discoverPluginComponents( pluginRealm, plugin, pluginDescriptor );
-        }
+        discoverPluginComponents( pluginRealm, plugin, pluginDescriptor );
 
         pluginDescriptor.setClassRealm( pluginRealm );
         pluginDescriptor.setArtifacts( pluginArtifacts );


[3/5] maven git commit: MNG-5742 fixed null ComponentDescriptor#realm for extensions plugins

Posted by kh...@apache.org.
MNG-5742 fixed null ComponentDescriptor#realm for extensions plugins

Signed-off-by: Igor Fedorenko <if...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/a670e907
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/a670e907
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/a670e907

Branch: refs/heads/maven-3.2.6
Commit: a670e90788c97bad80f94de9ada5f4fb0b00bbab
Parents: b46fa7d
Author: Igor Fedorenko <if...@apache.org>
Authored: Fri Dec 26 13:27:46 2014 -0500
Committer: Karl Heinz Marbaise <kh...@apache.org>
Committed: Mon Oct 12 22:47:26 2015 +0200

----------------------------------------------------------------------
 .../internal/DefaultMavenPluginManager.java     |  9 ++++--
 .../apache/maven/plugin/PluginManagerTest.java  | 21 +++++++++++++
 .../pom.xml                                     | 31 ++++++++++++++++++++
 3 files changed, 59 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/a670e907/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index c815920..5704276 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -390,8 +390,6 @@ public class DefaultMavenPluginManager
         RepositorySystemSession repositorySession = session.getRepositorySession();
         if ( plugin.isExtensions() )
         {
-            // TODO discover components in #setupExtensionsRealm
-
             ExtensionRealmCache.CacheRecord extensionRecord;
             try
             {
@@ -406,6 +404,11 @@ public class DefaultMavenPluginManager
 
             pluginRealm = extensionRecord.realm;
             pluginArtifacts = extensionRecord.artifacts;
+
+            for ( ComponentDescriptor<?> componentDescriptor : pluginDescriptor.getComponents() )
+            {
+                componentDescriptor.setRealm( pluginRealm );
+            }
         }
         else
         {
@@ -877,6 +880,8 @@ public class DefaultMavenPluginManager
         {
             ClassRealm extensionRealm = classRealmManager.createExtensionRealm( plugin, toAetherArtifacts( artifacts ) );
 
+            // TODO figure out how to use the same PluginDescriptor when running mojos
+
             PluginDescriptor pluginDescriptor = null;
             if ( plugin.isExtensions() && !artifacts.isEmpty() )
             {

http://git-wip-us.apache.org/repos/asf/maven/blob/a670e907/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java
----------------------------------------------------------------------
diff --git a/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java b/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java
index bc87702..025e772 100644
--- a/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java
+++ b/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java
@@ -30,6 +30,7 @@ import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.component.repository.ComponentDescriptor;
 
@@ -318,4 +319,24 @@ public class PluginManagerTest
             assertNotNull( descriptor.getImplementationClass() );
         }
     }
+
+    public void testBuildExtensionsPluginLoading()
+        throws Exception
+    {
+        RepositoryRequest repositoryRequest = new DefaultRepositoryRequest();
+        repositoryRequest.setLocalRepository( getLocalRepository() );
+        repositoryRequest.setRemoteRepositories( getPluginArtifactRepositories() );
+
+        // prime realm cache
+        MavenSession session = createMavenSession( getProject( "project-with-build-extensions-plugin" ) );
+        MavenProject project = session.getCurrentProject();
+        Plugin plugin = project.getPlugin( "org.apache.maven.its.plugins:maven-it-plugin" );
+
+        PluginDescriptor pluginDescriptor =
+            pluginManager.loadPlugin( plugin, session.getCurrentProject().getRemotePluginRepositories(),
+                                      session.getRepositorySession() );
+        ClassRealm pluginRealm = pluginManager.getPluginRealm( session, pluginDescriptor );
+        
+        assertEquals(pluginRealm, pluginDescriptor.getComponents().get(0).getRealm());
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/a670e907/maven-core/src/test/projects/plugin-manager/project-with-build-extensions-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/maven-core/src/test/projects/plugin-manager/project-with-build-extensions-plugin/pom.xml b/maven-core/src/test/projects/plugin-manager/project-with-build-extensions-plugin/pom.xml
new file mode 100644
index 0000000..d4e34a5
--- /dev/null
+++ b/maven-core/src/test/projects/plugin-manager/project-with-build-extensions-plugin/pom.xml
@@ -0,0 +1,31 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.test</groupId>
+  <artifactId>project-with-build-extensions-plugin</artifactId>
+  <version>1.0</version>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.its.plugins</groupId>
+        <artifactId>maven-it-plugin</artifactId>
+        <version>0.1</version>
+        <extensions>true</extensions>
+        <executions>
+          <execution>
+            <id>load</id>
+            <phase>validate</phase>
+            <configuration>
+              <resourcePaths>maven-core-it.properties</resourcePaths>
+              <pluginClassLoaderOutput>target/pcl.properties</pluginClassLoaderOutput>
+            </configuration>
+            <goals>
+              <goal>load</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>


[2/5] maven git commit: MNG-5742 fixed duplicate plugin realms when extensions=true

Posted by kh...@apache.org.
MNG-5742 fixed duplicate plugin realms when extensions=true

Consolidated plugin realm setup logic in DefaultMavenPluginManager.
Extensions realm is fully setup during project loading and the same
realm is used to both load extensions and execute plugin goals now.

Signed-off-by: Igor Fedorenko <if...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/b46fa7d6
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/b46fa7d6
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/b46fa7d6

Branch: refs/heads/maven-3.2.6
Commit: b46fa7d6f51b0caf5894f397edc1b5fb3ec252bd
Parents: 13b8964
Author: Igor Fedorenko <if...@apache.org>
Authored: Wed Dec 24 09:23:55 2014 -0500
Committer: Karl Heinz Marbaise <kh...@apache.org>
Committed: Mon Oct 12 22:47:21 2015 +0200

----------------------------------------------------------------------
 .../plugin/DefaultExtensionRealmCache.java      |  11 +-
 .../plugin/DefaultPluginArtifactsCache.java     |   2 +-
 .../maven/plugin/ExtensionRealmCache.java       |  12 +-
 .../apache/maven/plugin/MavenPluginManager.java |  10 +
 .../maven/plugin/PluginArtifactsCache.java      |   2 +-
 .../internal/DefaultMavenPluginManager.java     | 257 +++++++++++++++++--
 .../project/DefaultModelBuildingListener.java   |   7 +
 .../project/DefaultProjectBuildingHelper.java   | 146 ++---------
 .../project/ExtensionDescriptorBuilder.java     |   2 +-
 .../maven/project/ProjectBuildingHelper.java    |   3 +-
 10 files changed, 286 insertions(+), 166 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
index bda84d0..c9df92c 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
@@ -25,13 +25,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.project.ExtensionDescriptor;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
-import org.eclipse.aether.artifact.Artifact;
 
 /**
  * Default extension realm cache implementation. Assumes cached data does not change.
@@ -55,7 +55,7 @@ public class DefaultExtensionRealmCache
 
         private final int hashCode;
 
-        public CacheKey( List<? extends Artifact> extensionArtifacts )
+        public CacheKey( List<Artifact> extensionArtifacts )
         {
             this.files = new ArrayList<File>( extensionArtifacts.size() );
             this.timestamps = new ArrayList<Long>( extensionArtifacts.size() );
@@ -110,7 +110,7 @@ public class DefaultExtensionRealmCache
     protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<Key, CacheRecord>();
 
     @Override
-    public Key createKey( List<? extends Artifact> extensionArtifacts )
+    public Key createKey( List<Artifact> extensionArtifacts )
     {
         return new CacheKey( extensionArtifacts );
     }
@@ -120,7 +120,8 @@ public class DefaultExtensionRealmCache
         return cache.get( key );
     }
 
-    public CacheRecord put( Key key, ClassRealm extensionRealm, ExtensionDescriptor extensionDescriptor )
+    public CacheRecord put( Key key, ClassRealm extensionRealm, ExtensionDescriptor extensionDescriptor,
+                            List<Artifact> artifacts )
     {
         if ( extensionRealm == null )
         {
@@ -132,7 +133,7 @@ public class DefaultExtensionRealmCache
             throw new IllegalStateException( "Duplicate extension realm for extension " + key );
         }
 
-        CacheRecord record = new CacheRecord( extensionRealm, extensionDescriptor );
+        CacheRecord record = new CacheRecord( extensionRealm, extensionDescriptor, artifacts );
 
         cache.put( key, record );
 

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
index 6ee3463..23bda64 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
@@ -25,11 +25,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.component.annotations.Component;
 import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.RemoteRepository;

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
index 3dfb5fd..d50df0e 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
@@ -21,10 +21,10 @@ package org.apache.maven.plugin;
 
 import java.util.List;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.project.ExtensionDescriptor;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
-import org.eclipse.aether.artifact.Artifact;
 
 /**
  * Caches extension class realms. <strong>Warning:</strong> This is an internal utility interface that is only public
@@ -51,19 +51,23 @@ public interface ExtensionRealmCache
 
         public final ExtensionDescriptor desciptor;
 
-        public CacheRecord( ClassRealm realm, ExtensionDescriptor descriptor )
+        public final List<Artifact> artifacts;
+
+        public CacheRecord( ClassRealm realm, ExtensionDescriptor descriptor, List<Artifact> artifacts )
         {
             this.realm = realm;
             this.desciptor = descriptor;
+            this.artifacts = artifacts;
         }
 
     }
 
-    Key createKey( List<? extends Artifact> extensionArtifacts );
+    Key createKey( List<Artifact> extensionArtifacts );
 
     CacheRecord get( Key key );
 
-    CacheRecord put( Key key, ClassRealm extensionRealm, ExtensionDescriptor extensionDescriptor );
+    CacheRecord put( Key key, ClassRealm extensionRealm, ExtensionDescriptor extensionDescriptor,
+                     List<Artifact> artifacts );
 
     void flush();
 

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
index 8f6c3a8..a1314fc 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
@@ -25,6 +25,7 @@ import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.project.MavenProject;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.repository.RemoteRepository;
@@ -92,6 +93,15 @@ public interface MavenPluginManager
         throws PluginResolutionException, PluginContainerException;
 
     /**
+     * Sets up class realm for the specified build extensions plugin.
+     * 
+     * @since 3.2.6
+     */
+    ExtensionRealmCache.CacheRecord setupExtensionsRealm( MavenProject project, Plugin plugin,
+                                                          RepositorySystemSession session )
+        throws PluginManagerException;
+
+    /**
      * Looks up the mojo for the specified mojo execution and populates its parameters from the configuration given by
      * the mojo execution. The mojo/plugin descriptor associated with the mojo execution provides the class realm to
      * lookup the mojo from. <strong>Warning:</strong> The returned mojo instance must be released via

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java b/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
index 1232052..17537a2 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
@@ -21,10 +21,10 @@ package org.apache.maven.plugin;
 
 import java.util.List;
 
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.project.MavenProject;
 import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.graph.DependencyFilter;
 import org.eclipse.aether.repository.RemoteRepository;
 

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index 842987b..c815920 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -46,17 +46,20 @@ import org.apache.maven.model.Plugin;
 import org.apache.maven.monitor.logging.DefaultLog;
 import org.apache.maven.plugin.ContextEnabled;
 import org.apache.maven.plugin.DebugConfigurationListener;
+import org.apache.maven.plugin.ExtensionRealmCache;
 import org.apache.maven.plugin.InvalidPluginDescriptorException;
 import org.apache.maven.plugin.MavenPluginManager;
 import org.apache.maven.plugin.MavenPluginValidator;
 import org.apache.maven.plugin.Mojo;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoNotFoundException;
+import org.apache.maven.plugin.PluginArtifactsCache;
 import org.apache.maven.plugin.PluginConfigurationException;
 import org.apache.maven.plugin.PluginContainerException;
 import org.apache.maven.plugin.PluginDescriptorCache;
 import org.apache.maven.plugin.PluginDescriptorParsingException;
 import org.apache.maven.plugin.PluginIncompatibleException;
+import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.plugin.PluginParameterException;
 import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
 import org.apache.maven.plugin.PluginRealmCache;
@@ -65,6 +68,12 @@ import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.Parameter;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder;
+import org.apache.maven.plugin.version.DefaultPluginVersionRequest;
+import org.apache.maven.plugin.version.PluginVersionRequest;
+import org.apache.maven.plugin.version.PluginVersionResolutionException;
+import org.apache.maven.plugin.version.PluginVersionResolver;
+import org.apache.maven.project.ExtensionDescriptor;
+import org.apache.maven.project.ExtensionDescriptorBuilder;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.rtinfo.RuntimeInformation;
 import org.apache.maven.session.scope.internal.SessionScopeModule;
@@ -111,6 +120,15 @@ public class DefaultMavenPluginManager
     implements MavenPluginManager
 {
 
+    /**
+     * PluginId=>ExtensionRealmCache.CacheRecord map MavenProject context value key. The map is used to ensure the same
+     * class realm is used to load build extensions and load mojos for extensions=true plugins.
+     * 
+     * @noreference this is part of internal implementation and may be changed or removed without notice
+     * @since 3.2.6
+     */
+    public static final String KEY_EXTENSIONS_REALMS = DefaultMavenPluginManager.class.getName() + "/extensionsRealms";
+
     @Requirement
     private Logger logger;
 
@@ -135,6 +153,17 @@ public class DefaultMavenPluginManager
     @Requirement
     private RuntimeInformation runtimeInformation;
 
+    @Requirement
+    private ExtensionRealmCache extensionRealmCache;
+
+    @Requirement
+    private PluginVersionResolver pluginVersionResolver;
+
+    @Requirement
+    private PluginArtifactsCache pluginArtifactsCache;
+
+    private ExtensionDescriptorBuilder extensionDescriptorBuilder = new ExtensionDescriptorBuilder();
+
     private PluginDescriptorBuilder builder = new PluginDescriptorBuilder();
 
     public synchronized PluginDescriptor getPluginDescriptor( Plugin plugin, List<RemoteRepository> repositories,
@@ -355,45 +384,72 @@ public class DefaultMavenPluginManager
 
         MavenProject project = session.getCurrentProject();
 
-        DependencyFilter dependencyFilter = project.getExtensionDependencyFilter();
-        dependencyFilter = AndDependencyFilter.newInstance( dependencyFilter, filter );
-
-        DependencyNode root =
-            pluginDependenciesResolver.resolve( plugin, RepositoryUtils.toArtifact( pluginArtifact ), dependencyFilter,
-                                                project.getRemotePluginRepositories(), session.getRepositorySession() );
+        final ClassRealm pluginRealm;
+        final List<Artifact> pluginArtifacts;
 
-        PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
-        root.accept( nlg );
-
-        List<Artifact> exposedPluginArtifacts = new ArrayList<Artifact>( nlg.getNodes().size() );
-        RepositoryUtils.toArtifacts( exposedPluginArtifacts, Collections.singleton( root ),
-                                     Collections.<String>emptyList(), null );
-        for ( Iterator<Artifact> it = exposedPluginArtifacts.iterator(); it.hasNext(); )
+        RepositorySystemSession repositorySession = session.getRepositorySession();
+        if ( plugin.isExtensions() )
         {
-            Artifact artifact = it.next();
-            if ( artifact.getFile() == null )
+            // TODO discover components in #setupExtensionsRealm
+
+            ExtensionRealmCache.CacheRecord extensionRecord;
+            try
             {
-                it.remove();
+                extensionRecord = setupExtensionsRealm( project, plugin, repositorySession );
             }
+            catch ( PluginManagerException e )
+            {
+                // extensions realm is expected to be fully setup at this point
+                // any exception means a problem in maven code, not a user error
+                throw new IllegalStateException( e );
+            }
+
+            pluginRealm = extensionRecord.realm;
+            pluginArtifacts = extensionRecord.artifacts;
         }
+        else
+        {
+            DependencyFilter dependencyFilter = project.getExtensionDependencyFilter();
+            dependencyFilter = AndDependencyFilter.newInstance( dependencyFilter, filter );
+
+            DependencyNode root =
+                pluginDependenciesResolver.resolve( plugin, RepositoryUtils.toArtifact( pluginArtifact ),
+                                                    dependencyFilter, project.getRemotePluginRepositories(),
+                                                    repositorySession );
 
-        List<org.eclipse.aether.artifact.Artifact> pluginArtifacts = nlg.getArtifacts( true );
+            PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+            root.accept( nlg );
 
-        ClassRealm pluginRealm =
-            classRealmManager.createPluginRealm( plugin, parent, null, foreignImports, pluginArtifacts );
+            pluginArtifacts = toMavenArtifacts( root, nlg );
+
+            pluginRealm =
+                classRealmManager.createPluginRealm( plugin, parent, null, foreignImports,
+                                                     toAetherArtifacts( pluginArtifacts ) );
+
+            discoverPluginComponents( pluginRealm, plugin, pluginDescriptor );
+        }
 
         pluginDescriptor.setClassRealm( pluginRealm );
-        pluginDescriptor.setArtifacts( exposedPluginArtifacts );
+        pluginDescriptor.setArtifacts( pluginArtifacts );
+    }
 
+    private void discoverPluginComponents( final ClassRealm pluginRealm, Plugin plugin,
+                                           PluginDescriptor pluginDescriptor )
+        throws PluginContainerException
+    {
         try
         {
-            for ( ComponentDescriptor<?> componentDescriptor : pluginDescriptor.getComponents() )
+            if ( pluginDescriptor != null )
             {
-                componentDescriptor.setRealm( pluginRealm );
-                container.addComponentDescriptor( componentDescriptor );
+                for ( ComponentDescriptor<?> componentDescriptor : pluginDescriptor.getComponents() )
+                {
+                    componentDescriptor.setRealm( pluginRealm );
+                    container.addComponentDescriptor( componentDescriptor );
+                }
             }
 
-            ( (DefaultPlexusContainer) container ).discoverComponents( pluginRealm, new SessionScopeModule( container ),
+            ( (DefaultPlexusContainer) container ).discoverComponents( pluginRealm,
+                                                                       new SessionScopeModule( container ),
                                                                        new MojoExecutionScopeModule( container ) );
         }
         catch ( ComponentLookupException e )
@@ -408,6 +464,26 @@ public class DefaultMavenPluginManager
         }
     }
 
+    private List<org.eclipse.aether.artifact.Artifact> toAetherArtifacts( final List<Artifact> pluginArtifacts )
+    {
+        return new ArrayList<org.eclipse.aether.artifact.Artifact>( RepositoryUtils.toArtifacts( pluginArtifacts ) );
+    }
+
+    private List<Artifact> toMavenArtifacts( DependencyNode root, PreorderNodeListGenerator nlg )
+    {
+        List<Artifact> artifacts = new ArrayList<Artifact>( nlg.getNodes().size() );
+        RepositoryUtils.toArtifacts( artifacts, Collections.singleton( root ), Collections.<String>emptyList(), null );
+        for ( Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
+        {
+            Artifact artifact = it.next();
+            if ( artifact.getFile() == null )
+            {
+                it.remove();
+            }
+        }
+        return artifacts;
+    }
+
     private Map<String, ClassLoader> calcImports( MavenProject project, ClassLoader parent, List<String> imports )
     {
         Map<String, ClassLoader> foreignImports = new HashMap<String, ClassLoader>();
@@ -725,4 +801,137 @@ public class DefaultMavenPluginManager
         }
     }
 
+    public ExtensionRealmCache.CacheRecord setupExtensionsRealm( MavenProject project, Plugin plugin,
+                                                                 RepositorySystemSession session )
+        throws PluginManagerException
+    {
+        @SuppressWarnings( "unchecked" )
+        Map<String, ExtensionRealmCache.CacheRecord> pluginRealms =
+            (Map<String, ExtensionRealmCache.CacheRecord>) project.getContextValue( KEY_EXTENSIONS_REALMS );
+        if ( pluginRealms == null )
+        {
+            pluginRealms = new HashMap<String, ExtensionRealmCache.CacheRecord>();
+            project.setContextValue( KEY_EXTENSIONS_REALMS, pluginRealms );
+        }
+
+        final String pluginKey = plugin.getId();
+
+        ExtensionRealmCache.CacheRecord extensionRecord = pluginRealms.get( pluginKey );
+        if ( extensionRecord != null )
+        {
+            return extensionRecord;
+        }
+
+        final List<RemoteRepository> repositories = project.getRemotePluginRepositories();
+
+        // resolve plugin version as necessary
+        if ( plugin.getVersion() == null )
+        {
+            PluginVersionRequest versionRequest = new DefaultPluginVersionRequest( plugin, session, repositories );
+            try
+            {
+                plugin.setVersion( pluginVersionResolver.resolve( versionRequest ).getVersion() );
+            }
+            catch ( PluginVersionResolutionException e )
+            {
+                throw new PluginManagerException( plugin, e.getMessage(), e );
+            }
+        }
+
+        // resolve plugin artifacts
+        List<Artifact> artifacts;
+        PluginArtifactsCache.Key cacheKey = pluginArtifactsCache.createKey( plugin, null, repositories, session );
+        PluginArtifactsCache.CacheRecord recordArtifacts;
+        try
+        {
+            recordArtifacts = pluginArtifactsCache.get( cacheKey );
+        }
+        catch ( PluginResolutionException e )
+        {
+            throw new PluginManagerException( plugin, e.getMessage(), e );
+        }
+        if ( recordArtifacts != null )
+        {
+            artifacts = recordArtifacts.artifacts;
+        }
+        else
+        {
+            try
+            {
+                artifacts = resolveExtensionArtifacts( plugin, repositories, session );
+                recordArtifacts = pluginArtifactsCache.put( cacheKey, artifacts );
+            }
+            catch ( PluginResolutionException e )
+            {
+                pluginArtifactsCache.put( cacheKey, e );
+                pluginArtifactsCache.register( project, cacheKey, recordArtifacts );
+                throw new PluginManagerException( plugin, e.getMessage(), e );
+            }
+        }
+        pluginArtifactsCache.register( project, cacheKey, recordArtifacts );
+
+        // create and cache extensions realms
+        final ExtensionRealmCache.Key extensionKey = extensionRealmCache.createKey( artifacts );
+        extensionRecord = extensionRealmCache.get( extensionKey );
+        if ( extensionRecord == null )
+        {
+            ClassRealm extensionRealm = classRealmManager.createExtensionRealm( plugin, toAetherArtifacts( artifacts ) );
+
+            PluginDescriptor pluginDescriptor = null;
+            if ( plugin.isExtensions() && !artifacts.isEmpty() )
+            {
+                // ignore plugin descriptor parsing errors at this point
+                // these errors will reported during calculation of project build execution plan
+                try
+                {
+                    pluginDescriptor = extractPluginDescriptor( artifacts.get( 0 ), plugin );
+                }
+                catch ( PluginDescriptorParsingException e )
+                {
+                    // ignore, see above
+                }
+                catch ( InvalidPluginDescriptorException e )
+                {
+                    // ignore, see above
+                }
+            }
+
+            discoverPluginComponents( extensionRealm, plugin, pluginDescriptor );
+
+            ExtensionDescriptor extensionDescriptor = null;
+            Artifact extensionArtifact = artifacts.get( 0 );
+            try
+            {
+                extensionDescriptor = extensionDescriptorBuilder.build( extensionArtifact.getFile() );
+            }
+            catch ( IOException e )
+            {
+                String message = "Invalid extension descriptor for " + plugin.getId() + ": " + e.getMessage();
+                if ( logger.isDebugEnabled() )
+                {
+                    logger.error( message, e );
+                }
+                else
+                {
+                    logger.error( message );
+                }
+            }
+            extensionRecord = extensionRealmCache.put( extensionKey, extensionRealm, extensionDescriptor, artifacts );
+        }
+        extensionRealmCache.register( project, extensionKey, extensionRecord );
+        pluginRealms.put( pluginKey, extensionRecord );
+
+        return extensionRecord;
+    }
+
+    private List<Artifact> resolveExtensionArtifacts( Plugin extensionPlugin, List<RemoteRepository> repositories,
+                                                      RepositorySystemSession session )
+        throws PluginResolutionException
+    {
+        DependencyNode root = pluginDependenciesResolver.resolve( extensionPlugin, null, null, repositories, session );
+        PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+        root.accept( nlg );
+        return toMavenArtifacts( root, nlg );
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java b/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
index 5d97cfc..262cf09 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
@@ -28,6 +28,7 @@ import org.apache.maven.model.building.ModelBuildingEvent;
 import org.apache.maven.model.building.ModelProblem.Severity;
 import org.apache.maven.model.building.ModelProblem.Version;
 import org.apache.maven.model.building.ModelProblemCollectorRequest;
+import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.plugin.PluginResolutionException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 
@@ -125,6 +126,12 @@ class DefaultModelBuildingListener
                         .setMessage( "Unresolveable build extension: " + e.getMessage() )
                         .setException( e ) );
             }
+            catch ( PluginManagerException e )
+            {
+                event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
+                        .setMessage( "Unresolveable build extension: " + e.getMessage() )
+                        .setException( e ) );
+            }
 
             projectBuildingHelper.selectProjectRealm( project );
         }

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
index 035b42b..aea8fdb 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
@@ -19,7 +19,6 @@ package org.apache.maven.project;
  * under the License.
  */
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,37 +29,29 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.InvalidRepositoryException;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.classrealm.ClassRealmManager;
-import org.apache.maven.execution.scope.internal.MojoExecutionScopeModule;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Extension;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Repository;
 import org.apache.maven.plugin.ExtensionRealmCache;
-import org.apache.maven.plugin.PluginArtifactsCache;
+import org.apache.maven.plugin.MavenPluginManager;
+import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.plugin.PluginResolutionException;
-import org.apache.maven.plugin.internal.PluginDependenciesResolver;
-import org.apache.maven.plugin.version.DefaultPluginVersionRequest;
-import org.apache.maven.plugin.version.PluginVersionRequest;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
-import org.apache.maven.plugin.version.PluginVersionResolver;
 import org.apache.maven.repository.RepositorySystem;
-import org.apache.maven.session.scope.internal.SessionScopeModule;
-import org.codehaus.plexus.DefaultPlexusContainer;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.Logger;
-import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.graph.DependencyFilter;
-import org.eclipse.aether.graph.DependencyNode;
-import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.util.filter.ExclusionsDependencyFilter;
-import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator;
 
 /**
  * Assists the project builder. <strong>Warning:</strong> This is an internal utility class that is only public for
@@ -84,24 +75,13 @@ public class DefaultProjectBuildingHelper
     private ClassRealmManager classRealmManager;
 
     @Requirement
-    private PluginArtifactsCache pluginArtifactsCache;
-
-    @Requirement
-    private ExtensionRealmCache extensionRealmCache;
-
-    @Requirement
     private ProjectRealmCache projectRealmCache;
 
     @Requirement
     private RepositorySystem repositorySystem;
 
     @Requirement
-    private PluginVersionResolver pluginVersionResolver;
-
-    @Requirement
-    private PluginDependenciesResolver pluginDependenciesResolver;
-
-    private ExtensionDescriptorBuilder extensionDescriptorBuilder = new ExtensionDescriptorBuilder();
+    private MavenPluginManager pluginManager;
 
     public List<ArtifactRepository> createArtifactRepositories( List<Repository> pomRepositories,
                                                                 List<ArtifactRepository> externalRepositories,
@@ -165,7 +145,7 @@ public class DefaultProjectBuildingHelper
 
     public synchronized ProjectRealmCache.CacheRecord createProjectRealm( MavenProject project, Model model,
                                                                           ProjectBuildingRequest request )
-        throws PluginResolutionException, PluginVersionResolutionException
+        throws PluginResolutionException, PluginVersionResolutionException, PluginManagerException
     {
         ClassRealm projectRealm;
 
@@ -213,96 +193,12 @@ public class DefaultProjectBuildingHelper
 
         for ( Plugin plugin : extensionPlugins )
         {
-            if ( plugin.getVersion() == null )
-            {
-                PluginVersionRequest versionRequest =
-                    new DefaultPluginVersionRequest( plugin, request.getRepositorySession(),
-                                                     project.getRemotePluginRepositories() );
-                plugin.setVersion( pluginVersionResolver.resolve( versionRequest ).getVersion() );
-            }
-
-            List<Artifact> artifacts;
-
-            PluginArtifactsCache.Key cacheKey =
-                pluginArtifactsCache.createKey( plugin, null, project.getRemotePluginRepositories(),
-                                                request.getRepositorySession() );
-
-            PluginArtifactsCache.CacheRecord recordArtifacts = pluginArtifactsCache.get( cacheKey );
-
-            if ( recordArtifacts != null )
-            {
-                artifacts = recordArtifacts.artifacts;
-            }
-            else
-            {
-                try
-                {
-                    artifacts = resolveExtensionArtifacts( plugin, project.getRemotePluginRepositories(), request );
-
-                    recordArtifacts = pluginArtifactsCache.put( cacheKey, artifacts );
-                }
-                catch ( PluginResolutionException e )
-                {
-                    pluginArtifactsCache.put( cacheKey, e );
-
-                    pluginArtifactsCache.register( project, cacheKey, recordArtifacts );
-
-                    throw e;
-                }
-            }
-
-            pluginArtifactsCache.register( project, cacheKey, recordArtifacts );
-
-            ClassRealm extensionRealm;
-            ExtensionDescriptor extensionDescriptor = null;
+            ExtensionRealmCache.CacheRecord recordRealm =
+                pluginManager.setupExtensionsRealm( project, plugin, request.getRepositorySession() );
 
-            final ExtensionRealmCache.Key extensionKey = extensionRealmCache.createKey( artifacts );
-
-            ExtensionRealmCache.CacheRecord recordRealm = extensionRealmCache.get( extensionKey );
-
-            if ( recordRealm != null )
-            {
-                extensionRealm = recordRealm.realm;
-                extensionDescriptor = recordRealm.desciptor;
-            }
-            else
-            {
-                extensionRealm = classRealmManager.createExtensionRealm( plugin, artifacts );
-
-                try
-                {
-                    ( (DefaultPlexusContainer) container ).discoverComponents( extensionRealm,
-                                                                               new SessionScopeModule( container ),
-                                                                               new MojoExecutionScopeModule( container ) );
-                }
-                catch ( Exception e )
-                {
-                    throw new IllegalStateException( "Failed to discover components in extension realm "
-                        + extensionRealm.getId(), e );
-                }
-
-                Artifact extensionArtifact = artifacts.get( 0 );
-                try
-                {
-                    extensionDescriptor = extensionDescriptorBuilder.build( extensionArtifact.getFile() );
-                }
-                catch ( IOException e )
-                {
-                    String message = "Invalid extension descriptor for " + plugin.getId() + ": " + e.getMessage();
-                    if ( logger.isDebugEnabled() )
-                    {
-                        logger.error( message, e );
-                    }
-                    else
-                    {
-                        logger.error( message );
-                    }
-                }
-
-                recordRealm = extensionRealmCache.put( extensionKey, extensionRealm, extensionDescriptor );
-            }
-
-            extensionRealmCache.register( project, extensionKey, recordRealm );
+            final ClassRealm extensionRealm = recordRealm.realm;
+            final ExtensionDescriptor extensionDescriptor = recordRealm.desciptor;
+            final List<Artifact> artifacts = recordRealm.artifacts;
 
             extensionRealms.add( extensionRealm );
             if ( extensionDescriptor != null )
@@ -334,7 +230,7 @@ public class DefaultProjectBuildingHelper
 
         if ( record == null )
         {
-            projectRealm = classRealmManager.createProjectRealm( model, publicArtifacts );
+            projectRealm = classRealmManager.createProjectRealm( model, toAetherArtifacts( publicArtifacts ) );
 
             Set<String> exclusions = new LinkedHashSet<String>();
 
@@ -379,19 +275,6 @@ public class DefaultProjectBuildingHelper
         return record;
     }
 
-    private List<Artifact> resolveExtensionArtifacts( Plugin extensionPlugin, List<RemoteRepository> repositories,
-                                                      ProjectBuildingRequest request )
-        throws PluginResolutionException
-    {
-        DependencyNode root =
-            pluginDependenciesResolver.resolve( extensionPlugin, null, null, repositories,
-                                                request.getRepositorySession() );
-
-        PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
-        root.accept( nlg );
-        return nlg.getArtifacts( false );
-    }
-
     public void selectProjectRealm( MavenProject project )
     {
         ClassLoader projectRealm = project.getClassRealm();
@@ -404,4 +287,9 @@ public class DefaultProjectBuildingHelper
         Thread.currentThread().setContextClassLoader( projectRealm );
     }
 
+    private List<org.eclipse.aether.artifact.Artifact> toAetherArtifacts( final List<Artifact> pluginArtifacts )
+    {
+        return new ArrayList<org.eclipse.aether.artifact.Artifact>( RepositoryUtils.toArtifacts( pluginArtifacts ) );
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java b/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
index c18f87f..cebb630 100644
--- a/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
@@ -40,7 +40,7 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
  *
  * @author Benjamin Bentmann
  */
-class ExtensionDescriptorBuilder
+public class ExtensionDescriptorBuilder
 {
 
     private String getExtensionDescriptorLocation()

http://git-wip-us.apache.org/repos/asf/maven/blob/b46fa7d6/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java b/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
index 52b3a88..45fff6e 100644
--- a/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
+++ b/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
@@ -25,6 +25,7 @@ import org.apache.maven.artifact.InvalidRepositoryException;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Repository;
+import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.plugin.PluginResolutionException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 
@@ -66,7 +67,7 @@ public interface ProjectBuildingHelper
      */
     ProjectRealmCache.CacheRecord createProjectRealm( MavenProject project, Model model,
                                                       ProjectBuildingRequest request )
-        throws PluginResolutionException, PluginVersionResolutionException;
+        throws PluginResolutionException, PluginVersionResolutionException, PluginManagerException;
 
     /**
      * Updates the context class loader such that the container will search the project realm when the model builder