Fixing issues with reports used from the site plugin, where the reports' classloaders had been disconnected from the project/core parent realms, and so couldn't use maven libraries.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@604685 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2007-12-16 20:09:43 +00:00
parent fa0cce4fdb
commit b511c734a6
3 changed files with 129 additions and 12 deletions

View File

@ -1,7 +1,14 @@
package org.apache.maven; package org.apache.maven;
import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.apache.maven.plugin.Mojo;
import org.apache.maven.plugin.DefaultPluginManager;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import java.util.Iterator;
import java.util.List; import java.util.List;
public aspect CoreDebuggingAspect public aspect CoreDebuggingAspect
@ -14,4 +21,51 @@ public aspect CoreDebuggingAspect
// System.out.println( "Got projects-list of size " + ( projects == null ? "null" : "" + projects.size() ) + ":\n\n" + projects ); // System.out.println( "Got projects-list of size " + ( projects == null ? "null" : "" + projects.size() ) + ":\n\n" + projects );
// } // }
// private ClassRealm pluginRealm;
//
// after() returning( ClassRealm realm ):
// call( ClassRealm PluginDescriptor.getClassRealm() )
// && cflow( execution( * DefaultPluginManager.executeMojo( .. ) ) )
// {
// pluginRealm = realm;
// }
//
// after():
// execution( * DefaultPluginManager.executeMojo( .. ) )
// {
// pluginRealm = null;
// }
//
// void around():
// call( void Mojo+.execute( .. ) )
// {
// try
// {
// proceed();
// }
// catch( Error err )
// {
// System.out.println( "Plugin realm was " + pluginRealm + ":\n\n\n" );
// pluginRealm.display();
//
// throw err;
// }
// }
//
// after() returning( List reports ):
// cflow( execution( * PluginParameterExpressionEvaluator.evaluate( .. ) ) )
// && call( List MavenSession.getReports() )
// {
// System.out.println( "Injecting reports for ${reports} expression.\n\n" );
// if ( reports != null && !reports.isEmpty() )
// {
// for ( Iterator it = reports.iterator(); it.hasNext(); )
// {
// Object report = it.next();
// System.out.println( "Report: " + report + " has classloader:\n" + report.getClass().getClassLoader() );
// }
// }
// System.out.println( "\n\n" );
// }
} }

View File

@ -30,11 +30,13 @@
import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set;
import java.util.Stack; import java.util.Stack;
/** /**
@ -213,6 +215,11 @@ public MavenProject getCurrentProject()
*/ */
public List getReports() public List getReports()
{ {
if ( reports == null )
{
return Collections.EMPTY_LIST;
}
return new ArrayList( reports.values() ); return new ArrayList( reports.values() );
} }
@ -230,7 +237,17 @@ public void clearReports()
*/ */
public void addReport( MojoDescriptor mojoDescriptor, MavenReport report ) public void addReport( MojoDescriptor mojoDescriptor, MavenReport report )
{ {
reports.put( mojoDescriptor.getId(), report ); reports.put( mojoDescriptor, report );
}
public Set getReportMojoDescriptors()
{
if ( reports == null )
{
return Collections.EMPTY_SET;
}
return reports.keySet();
} }
} }

View File

@ -265,7 +265,7 @@ else if ( groupId.equals( e.getGroupId() ) && artifactId.equals( e.getArtifactId
PluginDescriptor pluginDescriptor = pluginCollector.getPluginDescriptor( plugin ); PluginDescriptor pluginDescriptor = pluginCollector.getPluginDescriptor( plugin );
setDescriptorClassAndArtifactInfo( pluginDescriptor, project, session ); setDescriptorClassAndArtifactInfo( pluginDescriptor, project, session, new ArrayList() );
return pluginDescriptor; return pluginDescriptor;
} }
@ -583,13 +583,13 @@ public void executeMojo( MavenProject project,
// by this time, the pluginDescriptor has had the correct realm setup from getConfiguredMojo(..) // by this time, the pluginDescriptor has had the correct realm setup from getConfiguredMojo(..)
ClassRealm pluginRealm = null; ClassRealm pluginRealm = null;
ClassRealm projectRealm = session.getRealmManager().getProjectRealm( project.getGroupId(), project.getArtifactId(), project.getVersion() );
ClassRealm oldLookupRealm = container.getLookupRealm(); ClassRealm oldLookupRealm = container.getLookupRealm();
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
List realmActions = new ArrayList();
try try
{ {
mojo = getConfiguredMojo( session, dom, project, false, mojoExecution ); mojo = getConfiguredMojo( session, dom, project, false, mojoExecution, realmActions );
dispatcher.dispatchStart( event, goalExecId ); dispatcher.dispatchStart( event, goalExecId );
@ -639,10 +639,10 @@ public void executeMojo( MavenProject project,
pluginDescriptor.setClassRealm( null ); pluginDescriptor.setClassRealm( null );
pluginDescriptor.setArtifacts( null ); pluginDescriptor.setArtifacts( null );
if ( ( pluginRealm != null ) && ( pluginRealm != container.getContainerRealm() ) for ( Iterator it = realmActions.iterator(); it.hasNext(); )
&& ( pluginRealm != projectRealm ) )
{ {
pluginRealm.setParentRealm( null ); PluginRealmAction action = (PluginRealmAction) it.next();
action.undo();
} }
if ( oldLookupRealm != null ) if ( oldLookupRealm != null )
@ -680,7 +680,7 @@ public MavenReport getReport( MavenProject project,
dom = Xpp3Dom.mergeXpp3Dom( dom, mojoExecution.getConfiguration() ); dom = Xpp3Dom.mergeXpp3Dom( dom, mojoExecution.getConfiguration() );
} }
return (MavenReport) getConfiguredMojo( session, dom, project, true, mojoExecution ); return (MavenReport) getConfiguredMojo( session, dom, project, true, mojoExecution, new ArrayList() );
} }
public PluginDescriptor verifyReportPlugin( ReportPlugin reportPlugin, public PluginDescriptor verifyReportPlugin( ReportPlugin reportPlugin,
@ -715,21 +715,35 @@ private Mojo getConfiguredMojo( MavenSession session,
Xpp3Dom dom, Xpp3Dom dom,
MavenProject project, MavenProject project,
boolean report, boolean report,
MojoExecution mojoExecution ) MojoExecution mojoExecution,
List realmActions )
throws PluginConfigurationException, PluginManagerException throws PluginConfigurationException, PluginManagerException
{ {
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor(); PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
setDescriptorClassAndArtifactInfo( pluginDescriptor, project, session ); setDescriptorClassAndArtifactInfo( pluginDescriptor, project, session, realmActions );
ClassRealm pluginRealm = pluginDescriptor.getClassRealm(); ClassRealm pluginRealm = pluginDescriptor.getClassRealm();
if ( mojoDescriptor.isRequiresReports() )
{
Set reportDescriptors = session.getReportMojoDescriptors();
if ( ( reportDescriptors != null ) && !reportDescriptors.isEmpty() )
{
for ( Iterator it = reportDescriptors.iterator(); it.hasNext(); )
{
MojoDescriptor reportDescriptor = (MojoDescriptor) it.next();
setDescriptorClassAndArtifactInfo( reportDescriptor.getPluginDescriptor(), project, session, realmActions );
}
}
}
// We are forcing the use of the plugin realm for all lookups that might occur during // We are forcing the use of the plugin realm for all lookups that might occur during
// the lifecycle that is part of the lookup. Here we are specifically trying to keep // the lifecycle that is part of the lookup. Here we are specifically trying to keep
// lookups that occur in contextualize calls in line with the right realm. // lookups that occur in contextualize calls in line with the right realm.
container.setLookupRealm( pluginRealm ); container.setLookupRealm( pluginRealm );
getLogger().debug( getLogger().debug(
@ -869,7 +883,8 @@ else if ( ( param.getAlias() != null ) && ( extractedMojoConfiguration.getChild(
private void setDescriptorClassAndArtifactInfo( PluginDescriptor pluginDescriptor, private void setDescriptorClassAndArtifactInfo( PluginDescriptor pluginDescriptor,
MavenProject project, MavenProject project,
MavenSession session ) MavenSession session,
List realmActions )
{ {
MavenRealmManager realmManager = session.getRealmManager(); MavenRealmManager realmManager = session.getRealmManager();
@ -894,10 +909,12 @@ private void setDescriptorClassAndArtifactInfo( PluginDescriptor pluginDescripto
getLogger().debug( "Realm for plugin: " + pluginDescriptor.getId() + " not found. Using project realm instead." ); getLogger().debug( "Realm for plugin: " + pluginDescriptor.getId() + " not found. Using project realm instead." );
pluginRealm = projectRealm; pluginRealm = projectRealm;
realmActions.add( new PluginRealmAction( pluginDescriptor ) );
} }
else else
{ {
pluginRealm.setParentRealm( projectRealm ); pluginRealm.setParentRealm( projectRealm );
realmActions.add( new PluginRealmAction( pluginDescriptor, pluginRealm ) );
} }
getLogger().debug( "Setting realm for plugin descriptor: " + pluginDescriptor.getId() + " to: " + pluginRealm ); getLogger().debug( "Setting realm for plugin descriptor: " + pluginDescriptor.getId() + " to: " + pluginRealm );
@ -1440,4 +1457,33 @@ public static void checkPlexusUtils( ResolutionGroup resolutionGroup,
Artifact.SCOPE_RUNTIME, "jar" ) ); Artifact.SCOPE_RUNTIME, "jar" ) );
} }
} }
private static final class PluginRealmAction
{
private final PluginDescriptor pluginDescriptor;
private final ClassRealm realmWithTransientParent;
PluginRealmAction( PluginDescriptor pluginDescriptor )
{
this.pluginDescriptor = pluginDescriptor;
realmWithTransientParent = null;
}
PluginRealmAction( PluginDescriptor pluginDescriptor, ClassRealm realmWithTransientParent )
{
this.pluginDescriptor = pluginDescriptor;
this.realmWithTransientParent = realmWithTransientParent;
}
void undo()
{
pluginDescriptor.setArtifacts( null );
pluginDescriptor.setClassRealm( null );
if ( realmWithTransientParent != null )
{
realmWithTransientParent.setParentRealm( null );
}
}
}
} }