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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]