You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by jd...@apache.org on 2005/06/21 00:42:27 UTC

svn commit: r191582 - /maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java

Author: jdcasey
Date: Mon Jun 20 15:42:26 2005
New Revision: 191582

URL: http://svn.apache.org/viewcvs?rev=191582&view=rev
Log:
Resolving: MNG-494

o During addPlugin() only the plugin's artifact is resolved/added...just enough to get the plugin container to discover the pluginDescriptor.

o During getConfiguredMojo(), the rest of the plugin's artifacts will be transitively resolved and added to the plugin container (if this hasn't already been done). The deciding factor for attempting to complete the plugin container's artifact list is whether the only artifact in the pluginDescriptor's artifact list is the plugin artifact itself. If that makes sense.

It's a bit of black magic, but I think it'll work unless/until we find something more elegant. I'm abusing the container a little bit here, so it might be sensitive to plexus changes in future.


Modified:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=191582&r1=191581&r2=191582&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Mon Jun 20 15:42:26 2005
@@ -173,7 +173,7 @@
     }
 
     public PluginDescriptor verifyPlugin( String groupId, String artifactId, String version, MavenProject project,
-                                          Settings settings, ArtifactRepository localRepository )
+                                         Settings settings, ArtifactRepository localRepository )
         throws ArtifactResolutionException, PluginManagerException, PluginVersionResolutionException
     {
         String pluginKey = groupId + ":" + artifactId;
@@ -222,15 +222,14 @@
             catch ( PlexusContainerException e )
             {
                 throw new PluginManagerException(
-                    "Error occurred in the artifact container attempting to download plugin " + groupId + ":" +
-                        artifactId, e );
+                                                  "Error occurred in the artifact container attempting to download plugin "
+                                                      + groupId + ":" + artifactId, e );
             }
             catch ( ArtifactResolutionException e )
             {
-                if (
-                    ( groupId == null || artifactId == null || version == null ||
-                        ( groupId.equals( e.getGroupId() ) && artifactId.equals( e.getArtifactId() ) &&
-                            version.equals( e.getVersion() ) ) ) && "maven-plugin".equals( e.getType() ) )
+                if ( ( groupId == null || artifactId == null || version == null || ( groupId.equals( e.getGroupId() )
+                    && artifactId.equals( e.getArtifactId() ) && version.equals( e.getVersion() ) ) )
+                    && "maven-plugin".equals( e.getType() ) )
                 {
                     throw new PluginNotFoundException( e );
                 }
@@ -241,8 +240,8 @@
             }
             catch ( ComponentLookupException e )
             {
-                throw new PluginManagerException(
-                    "Internal configuration error while retrieving " + groupId + ":" + artifactId, e );
+                throw new PluginManagerException( "Internal configuration error while retrieving " + groupId + ":"
+                    + artifactId, e );
             }
             finally
             {
@@ -257,39 +256,19 @@
     }
 
     protected void addPlugin( String pluginKey, Artifact pluginArtifact, MavenProject project,
-                              ArtifactRepository localRepository )
+                             ArtifactRepository localRepository )
         throws ArtifactResolutionException, ComponentLookupException, PlexusContainerException
     {
         ArtifactResolver artifactResolver = null;
-        MavenProjectBuilder mavenProjectBuilder = null;
-        ArtifactFactory artifactFactory = null;
 
         try
         {
             artifactResolver = (ArtifactResolver) container.lookup( ArtifactResolver.ROLE );
-            mavenProjectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.ROLE );
-            artifactFactory = (ArtifactFactory) container.lookup( ArtifactFactory.ROLE );
-
-            MavenMetadataSource metadataSource = new MavenMetadataSource( artifactResolver, mavenProjectBuilder,
-                                                                          artifactFactory );
-
-            ArtifactResolutionResult result = artifactResolver.resolveTransitively( Collections
-                .singleton( pluginArtifact ), project.getRemoteArtifactRepositories(), localRepository, metadataSource,
-                                              artifactFilter );
-
-            Map resolved = result.getArtifacts();
-
-            List files = new ArrayList();
-
-            for ( Iterator it = resolved.values().iterator(); it.hasNext(); )
-            {
-                Artifact artifact = (Artifact) it.next();
 
-                files.add( artifact.getFile() );
-            }
+            artifactResolver.resolve( pluginArtifact, project.getRemoteArtifactRepositories(), localRepository );
 
-            PlexusContainer child = container.createChildContainer( pluginKey, files, Collections.EMPTY_MAP,
-                                                                    Collections.singletonList( this ) );
+            PlexusContainer child = container.createChildContainer( pluginKey, Collections
+                .singletonList( pluginArtifact.getFile() ), Collections.EMPTY_MAP, Collections.singletonList( this ) );
 
             // this plugin's descriptor should have been discovered in the child creation, so we should be able to
             // circle around and set the artifacts and class realm
@@ -297,35 +276,17 @@
 
             addedPlugin.setClassRealm( child.getContainerRealm() );
 
-            ArtifactFilter distroProvidedFilter = new InversionArtifactFilter( artifactFilter );
-
-            ArtifactResolutionResult distroProvidedResult = artifactResolver.resolveTransitively( Collections
-                .singleton( pluginArtifact ), project.getRemoteArtifactRepositories(), localRepository, metadataSource,
-                                              distroProvidedFilter );
-
-            Map distroProvided = distroProvidedResult.getArtifacts();
-
-            List unfilteredArtifactList = new ArrayList( resolved.size() + distroProvided.size() );
-
-            unfilteredArtifactList.addAll( resolved.values() );
-            unfilteredArtifactList.addAll( distroProvided.values() );
-
-            addedPlugin.setArtifacts( unfilteredArtifactList );
+            // we're only setting the plugin's artifact itself as the artifact list, to allow it to be retrieved
+            // later when the plugin is first invoked. Retrieving this artifact will in turn allow us to 
+            // transitively resolve its dependencies, and add them to the plugin container...
+            addedPlugin.setArtifacts( Collections.singletonList( pluginArtifact ) );
         }
         finally
         {
-            if ( artifactFactory != null )
-            {
-                releaseComponent( artifactFactory );
-            }
             if ( artifactResolver != null )
             {
                 releaseComponent( artifactResolver );
             }
-            if ( mavenProjectBuilder != null )
-            {
-                releaseComponent( mavenProjectBuilder );
-            }
         }
     }
 
@@ -390,8 +351,6 @@
 
         String goalName = mojoDescriptor.getFullGoalName();
 
-        PlexusContainer pluginContainer = getPluginContainer( mojoDescriptor.getPluginDescriptor() );
-
         Mojo plugin = null;
 
         try
@@ -409,7 +368,7 @@
                 dom = Xpp3Dom.mergeXpp3Dom( dom, mojoExecution.getConfiguration() );
             }
 
-            plugin = getConfiguredMojo( pluginContainer, mojoDescriptor, session, dom, project );
+            plugin = getConfiguredMojo( mojoDescriptor, session, dom, project );
         }
         catch ( PluginConfigurationException e )
         {
@@ -434,6 +393,7 @@
         }
 
         dispatcher.dispatchStart( event, goalExecId );
+
         try
         {
             plugin.execute();
@@ -450,6 +410,8 @@
         {
             try
             {
+                PlexusContainer pluginContainer = getPluginContainer( mojoDescriptor.getPluginDescriptor() );
+
                 pluginContainer.release( plugin );
             }
             catch ( ComponentLifecycleException e )
@@ -463,13 +425,11 @@
     }
 
     public List getReports( String groupId, String artifactId, String version, ReportSet reportSet,
-                            MavenSession session, MavenProject project )
+                           MavenSession session, MavenProject project )
         throws PluginManagerException, PluginVersionResolutionException, PluginConfigurationException
     {
         PluginDescriptor pluginDescriptor = getPluginDescriptor( groupId, artifactId, version );
 
-        PlexusContainer pluginContainer = getPluginContainer( pluginDescriptor );
-
         List reports = new ArrayList();
         for ( Iterator i = pluginDescriptor.getMojos().iterator(); i.hasNext(); )
         {
@@ -492,7 +452,7 @@
                     String executionId = mojoExecution.getExecutionId();
                     Xpp3Dom dom = project.getReportConfiguration( groupId, artifactId, executionId );
 
-                    reports.add( getConfiguredMojo( pluginContainer, mojoDescriptor, session, dom, project ) );
+                    reports.add( getConfiguredMojo( mojoDescriptor, session, dom, project ) );
                 }
                 catch ( ComponentLookupException e )
                 {
@@ -517,15 +477,23 @@
         return pluginContainer;
     }
 
-    private Mojo getConfiguredMojo( PlexusContainer pluginContainer, MojoDescriptor mojoDescriptor,
-                                    MavenSession session, Xpp3Dom dom, MavenProject project )
-        throws ComponentLookupException, PluginConfigurationException
+    private Mojo getConfiguredMojo( MojoDescriptor mojoDescriptor, MavenSession session, Xpp3Dom dom,
+                                   MavenProject project )
+        throws ComponentLookupException, PluginConfigurationException, PluginManagerException
     {
-        Mojo plugin = (Mojo) pluginContainer.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint() );
-        plugin.setLog( mojoLogger );
+        PlexusContainer pluginContainer = getPluginContainer( mojoDescriptor.getPluginDescriptor() );
 
         PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
 
+        // if this is the first time this plugin has been used, the plugin's container will only 
+        // contain the plugin's artifact in isolation; we need to finish resolving the plugin's
+        // dependencies, and add them to the container.
+        ensurePluginContainerIsComplete( pluginDescriptor, pluginContainer, project, session );
+
+        Mojo plugin = (Mojo) pluginContainer.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint() );
+
+        plugin.setLog( mojoLogger );
+
         PlexusConfiguration pomConfiguration;
         if ( dom == null )
         {
@@ -554,23 +522,111 @@
         PlexusConfiguration extractedMojoConfiguration = extractMojoConfiguration( mergedConfiguration, mojoDescriptor );
 
         checkRequiredParameters( mojoDescriptor, extractedMojoConfiguration, expressionEvaluator, plugin );
-        
+
         populatePluginFields( plugin, mojoDescriptor, extractedMojoConfiguration, pluginContainer, expressionEvaluator );
         return plugin;
     }
 
-    private PlexusConfiguration extractMojoConfiguration( PlexusConfiguration mergedConfiguration, MojoDescriptor mojoDescriptor )
+    private void ensurePluginContainerIsComplete( PluginDescriptor pluginDescriptor, PlexusContainer pluginContainer,
+                                                  MavenProject project, MavenSession session )
+        throws PluginConfigurationException, ComponentLookupException
+    {
+        // if the plugin's already been used once, don't re-do this step...
+        // otherwise, we have to finish resolving the plugin's classpath and start the container.
+        if ( pluginDescriptor.getArtifacts() != null && pluginDescriptor.getArtifacts().size() == 1 )
+        {
+            // TODO: this is a little shady...
+            Artifact pluginArtifact = (Artifact) pluginDescriptor.getArtifacts().get( 0 );
+
+            ArtifactResolver artifactResolver = null;
+            MavenProjectBuilder mavenProjectBuilder = null;
+            ArtifactFactory artifactFactory = null;
+
+            try
+            {
+                artifactResolver = (ArtifactResolver) container.lookup( ArtifactResolver.ROLE );
+                mavenProjectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.ROLE );
+                artifactFactory = (ArtifactFactory) container.lookup( ArtifactFactory.ROLE );
+
+                MavenMetadataSource metadataSource = new MavenMetadataSource( artifactResolver, mavenProjectBuilder,
+                                                                              artifactFactory );
+
+                ArtifactResolutionResult result = artifactResolver.resolveTransitively( Collections
+                    .singleton( pluginArtifact ), project.getRemoteArtifactRepositories(),
+                                                                                        session.getLocalRepository(),
+                                                                                        metadataSource, artifactFilter );
+
+                Map resolved = result.getArtifacts();
+
+                List files = new ArrayList();
+
+                for ( Iterator it = resolved.values().iterator(); it.hasNext(); )
+                {
+                    Artifact artifact = (Artifact) it.next();
+
+                    if ( artifact != pluginArtifact )
+                    {
+                        pluginContainer.addJarResource( artifact.getFile() );
+                    }
+                }
+
+                pluginDescriptor.setClassRealm( pluginContainer.getContainerRealm() );
+
+                ArtifactFilter distroProvidedFilter = new InversionArtifactFilter( artifactFilter );
+
+                ArtifactResolutionResult distroProvidedResult = artifactResolver
+                    .resolveTransitively( Collections.singleton( pluginArtifact ), project
+                        .getRemoteArtifactRepositories(), session.getLocalRepository(), metadataSource,
+                                          distroProvidedFilter );
+
+                Map distroProvided = distroProvidedResult.getArtifacts();
+
+                List unfilteredArtifactList = new ArrayList( resolved.size() + distroProvided.size() );
+
+                unfilteredArtifactList.addAll( resolved.values() );
+                unfilteredArtifactList.addAll( distroProvided.values() );
+
+                pluginDescriptor.setArtifacts( unfilteredArtifactList );
+            }
+            catch ( ArtifactResolutionException e )
+            {
+                throw new PluginConfigurationException( "Cannot resolve plugin dependencies", e );
+            }
+            catch ( PlexusContainerException e )
+            {
+                throw new PluginConfigurationException( "Cannot start plugin container", e );
+            }
+            finally
+            {
+                if ( artifactFactory != null )
+                {
+                    releaseComponent( artifactFactory );
+                }
+                if ( artifactResolver != null )
+                {
+                    releaseComponent( artifactResolver );
+                }
+                if ( mavenProjectBuilder != null )
+                {
+                    releaseComponent( mavenProjectBuilder );
+                }
+            }
+        }
+    }
+
+    private PlexusConfiguration extractMojoConfiguration( PlexusConfiguration mergedConfiguration,
+                                                         MojoDescriptor mojoDescriptor )
     {
         Map parameterMap = mojoDescriptor.getParameterMap();
-        
+
         PlexusConfiguration[] mergedChildren = mergedConfiguration.getChildren();
-        
+
         XmlPlexusConfiguration extractedConfiguration = new XmlPlexusConfiguration( "configuration" );
-        
+
         for ( int i = 0; i < mergedChildren.length; i++ )
         {
             PlexusConfiguration child = mergedChildren[i];
-            
+
             if ( parameterMap.containsKey( child.getName() ) )
             {
                 extractedConfiguration.addChild( DefaultPluginManager.copyConfiguration( child ) );
@@ -579,15 +635,17 @@
             {
                 // TODO: I defy anyone to find these messages in the '-X' output! Do we need a new log level?
                 // ideally, this would be elevated above the true debug output, but below the default INFO level...
-                getLogger().debug( "*** WARNING: Configuration \'" + child.getName() + "\' is not used in goal \'" + mojoDescriptor.getFullGoalName() + "; this may indicate a typo... ***");
+                getLogger().debug(
+                                   "*** WARNING: Configuration \'" + child.getName() + "\' is not used in goal \'"
+                                       + mojoDescriptor.getFullGoalName() + "; this may indicate a typo... ***" );
             }
         }
-        
+
         return extractedConfiguration;
     }
 
     private void checkRequiredParameters( MojoDescriptor goal, PlexusConfiguration configuration,
-                                          ExpressionEvaluator expressionEvaluator, Mojo plugin )
+                                         ExpressionEvaluator expressionEvaluator, Mojo plugin )
         throws PluginConfigurationException
     {
         // TODO: this should be built in to the configurator, as we presently double process the expressions
@@ -660,8 +718,8 @@
                         if ( fieldValue != null )
                         {
                             getLogger().warn(
-                                "DEPRECATED: using default-value to set the default value of field '" +
-                                    parameter.getName() + "'" );
+                                              "DEPRECATED: using default-value to set the default value of field '"
+                                                  + parameter.getName() + "'" );
                         }
                     }
                     catch ( NoSuchFieldException e )
@@ -777,7 +835,7 @@
     // ----------------------------------------------------------------------
 
     private void populatePluginFields( Mojo plugin, MojoDescriptor mojoDescriptor, PlexusConfiguration configuration,
-                                       PlexusContainer pluginContainer, ExpressionEvaluator expressionEvaluator )
+                                      PlexusContainer pluginContainer, ExpressionEvaluator expressionEvaluator )
         throws PluginConfigurationException
     {
         ComponentConfigurator configurator = null;
@@ -809,7 +867,8 @@
         catch ( ComponentLookupException e )
         {
             throw new PluginConfigurationException(
-                "Unable to retrieve component configurator for plugin configuration", e );
+                                                    "Unable to retrieve component configurator for plugin configuration",
+                                                    e );
         }
         finally
         {
@@ -849,7 +908,7 @@
     }
 
     public static String createPluginParameterRequiredMessage( MojoDescriptor mojo, Parameter parameter,
-                                                               String expression )
+                                                              String expression )
     {
         StringBuffer message = new StringBuffer();
 
@@ -906,8 +965,24 @@
     {
         // TODO: configure this from bootstrap or scan lib
         // TODO: remove doxia
-        artifactFilter = new ExclusionSetFilter(
-            new String[]{"classworlds", "maven-artifact", "maven-core", "maven-model", "maven-monitor", "maven-plugin-api", "maven-plugin-descriptor", "maven-project", "maven-settings", "plexus-container-default", "plexus-utils", "wagon-provider-api", "wagon-ssh", "wagon-http-lightweight", "wagon-file", "doxia-core", "maven-reporting-api"} );
+        artifactFilter = new ExclusionSetFilter( new String[] {
+            "classworlds",
+            "maven-artifact",
+            "maven-core",
+            "maven-model",
+            "maven-monitor",
+            "maven-plugin-api",
+            "maven-plugin-descriptor",
+            "maven-project",
+            "maven-settings",
+            "plexus-container-default",
+            "plexus-utils",
+            "wagon-provider-api",
+            "wagon-ssh",
+            "wagon-http-lightweight",
+            "wagon-file",
+            "doxia-core",
+            "maven-reporting-api" } );
     }
 
     // ----------------------------------------------------------------------
@@ -915,8 +990,8 @@
     // ----------------------------------------------------------------------
 
     private void resolveTransitiveDependencies( MavenSession context, ArtifactResolver artifactResolver,
-                                                MavenProjectBuilder mavenProjectBuilder, String scope,
-                                                ArtifactFactory artifactFactory, MavenProject project )
+                                               MavenProjectBuilder mavenProjectBuilder, String scope,
+                                               ArtifactFactory artifactFactory, MavenProject project )
         throws ArtifactResolutionException
     {
         MavenMetadataSource sourceReader = new MavenMetadataSource( artifactResolver, mavenProjectBuilder,



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org