mirror of https://github.com/apache/maven.git
Adding project-level ClassRealm, which serves as a nexus for extensions. Extensions are loaded into separate ClassRealm instances, then scanned for components. These ComponentDescriptors are then used to add an import from the extension realm back to the project-session realm, and then the descriptor is added to the container with the project realm as its RealmId. From here, the registerWagons() method has been changed to use the map of projectSessions, and iterates through each project-level realm, setting the lookup-realm, then calling findAndRegisterWagons(..) for each. Also, the plugin manager has been changed to use the project-realm for loading plugins if it exists (the plugin realm becomes a child of the project realm, which should allow plugins to vary by project within a single reactor, though I haven't tested that yet).
Also, shading the embedder to hide the jdom classes, and adjusting the assembly appropriately. Final thing: I'm rolling back some changes I accidentally made to the CLIManager the other day, which breaks the release plugin because the long options were removed for some reason (save action in Eclipse; don't ask). git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@585012 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cebe6bcb31
commit
ac8ff20611
|
@ -63,8 +63,10 @@ import java.io.IOException;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author jason van zyl
|
||||
|
@ -101,13 +103,13 @@ public class DefaultMaven
|
|||
// lifecycle execution
|
||||
|
||||
public ReactorManager createReactorManager( MavenExecutionRequest request,
|
||||
MavenExecutionResult result )
|
||||
MavenExecutionResult result,
|
||||
Map projectSessions )
|
||||
{
|
||||
List projects;
|
||||
|
||||
try
|
||||
{
|
||||
projects = getProjects( request );
|
||||
projects = getProjects( request, projectSessions );
|
||||
|
||||
if ( projects.isEmpty() )
|
||||
{
|
||||
|
@ -164,9 +166,12 @@ public class DefaultMaven
|
|||
|
||||
MavenExecutionResult result = new DefaultMavenExecutionResult();
|
||||
|
||||
Map projectSessions = new HashMap();
|
||||
|
||||
ReactorManager reactorManager = createReactorManager(
|
||||
request,
|
||||
result );
|
||||
result,
|
||||
projectSessions );
|
||||
|
||||
if ( result.hasExceptions() )
|
||||
{
|
||||
|
@ -184,7 +189,8 @@ public class DefaultMaven
|
|||
MavenSession session = createSession(
|
||||
request,
|
||||
reactorManager,
|
||||
dispatcher );
|
||||
dispatcher,
|
||||
projectSessions );
|
||||
|
||||
for ( Iterator i = request.getGoals().iterator(); i.hasNext(); )
|
||||
{
|
||||
|
@ -259,7 +265,7 @@ public class DefaultMaven
|
|||
systemContext.store( buildContextManager );
|
||||
}
|
||||
|
||||
private List getProjects( MavenExecutionRequest request )
|
||||
private List getProjects( MavenExecutionRequest request, Map projectSessions )
|
||||
throws MavenExecutionException
|
||||
{
|
||||
List projects;
|
||||
|
@ -280,7 +286,7 @@ public class DefaultMaven
|
|||
// instances just-in-time.
|
||||
try
|
||||
{
|
||||
buildExtensionScanner.scanForBuildExtensions( files, request.getLocalRepository(), request.getProfileManager() );
|
||||
buildExtensionScanner.scanForBuildExtensions( files, request.getLocalRepository(), request.getProfileManager(), projectSessions );
|
||||
}
|
||||
catch ( ExtensionScanningException e )
|
||||
{
|
||||
|
@ -415,14 +421,16 @@ public class DefaultMaven
|
|||
// or not.
|
||||
|
||||
protected MavenSession createSession( MavenExecutionRequest request,
|
||||
ReactorManager rpm,
|
||||
EventDispatcher dispatcher )
|
||||
ReactorManager reactorManager,
|
||||
EventDispatcher dispatcher,
|
||||
Map projectSessions )
|
||||
{
|
||||
MavenSession session = new MavenSession(
|
||||
container,
|
||||
request,
|
||||
dispatcher,
|
||||
rpm );
|
||||
reactorManager,
|
||||
projectSessions );
|
||||
|
||||
SessionContext ctx = new SessionContext( session );
|
||||
ctx.store( buildContextManager );
|
||||
|
|
|
@ -23,6 +23,8 @@ import org.apache.maven.execution.MavenExecutionRequest;
|
|||
import org.apache.maven.execution.MavenExecutionResult;
|
||||
import org.apache.maven.execution.ReactorManager;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
|
||||
* @version $Id$
|
||||
|
@ -53,5 +55,5 @@ public interface Maven
|
|||
|
||||
MavenExecutionResult execute( MavenExecutionRequest request );
|
||||
|
||||
ReactorManager createReactorManager( MavenExecutionRequest request, MavenExecutionResult result );
|
||||
ReactorManager createReactorManager( MavenExecutionRequest request, MavenExecutionResult result, Map projectSessions );
|
||||
}
|
|
@ -21,6 +21,7 @@ package org.apache.maven.execution;
|
|||
|
||||
import org.apache.maven.BuildFailureException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
|
||||
import org.apache.maven.extension.ExtensionScanningException;
|
||||
import org.apache.maven.lifecycle.LifecycleExecutionException;
|
||||
import org.apache.maven.project.DuplicateProjectException;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
|
@ -85,6 +86,13 @@ public class DefaultMavenExecutionResult
|
|||
return exceptions;
|
||||
}
|
||||
|
||||
public MavenExecutionResult addExtensionScanningException( ExtensionScanningException e )
|
||||
{
|
||||
addException( e );
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public MavenExecutionResult addProjectBuildingException( ProjectBuildingException e )
|
||||
{
|
||||
addException( e );
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.apache.maven.execution;
|
|||
|
||||
import org.apache.maven.BuildFailureException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
|
||||
import org.apache.maven.extension.ExtensionScanningException;
|
||||
import org.apache.maven.lifecycle.LifecycleExecutionException;
|
||||
import org.apache.maven.project.DuplicateProjectException;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
|
@ -58,6 +59,7 @@ public interface MavenExecutionResult
|
|||
MavenExecutionResult addBuildFailureException( BuildFailureException buildFailureException );
|
||||
MavenExecutionResult addMavenExecutionException( MavenExecutionException e );
|
||||
MavenExecutionResult addProjectBuildingException (ProjectBuildingException e );
|
||||
MavenExecutionResult addExtensionScanningException( ExtensionScanningException e );
|
||||
MavenExecutionResult addUnknownException( Throwable t );
|
||||
|
||||
boolean hasExceptions();
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
package org.apache.maven.execution;
|
||||
|
||||
import org.apache.maven.artifact.Artifact;
|
||||
import org.apache.maven.artifact.ArtifactUtils;
|
||||
import org.apache.maven.model.Plugin;
|
||||
import org.apache.maven.plugin.descriptor.PluginDescriptor;
|
||||
import org.codehaus.plexus.PlexusContainer;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.classworlds.realm.ClassRealm;
|
||||
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
|
||||
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class MavenProjectSession
|
||||
{
|
||||
|
||||
private Map componentRealms = new HashMap();
|
||||
|
||||
private String projectId;
|
||||
|
||||
private ClassRealm projectRealm;
|
||||
|
||||
private final PlexusContainer container;
|
||||
|
||||
public MavenProjectSession( String projectId,
|
||||
PlexusContainer container )
|
||||
throws PlexusContainerException
|
||||
{
|
||||
this.projectId = projectId;
|
||||
this.container = container;
|
||||
projectRealm = container.createComponentRealm( projectId, Collections.EMPTY_LIST );
|
||||
}
|
||||
|
||||
public String getProjectId()
|
||||
{
|
||||
return projectId;
|
||||
}
|
||||
|
||||
public void addComponentRealm( ClassRealm realm )
|
||||
{
|
||||
componentRealms.put( realm.getId(), realm );
|
||||
}
|
||||
|
||||
public static String createRealmId( Artifact realmArtifact )
|
||||
{
|
||||
return ArtifactUtils.versionlessKey( realmArtifact );
|
||||
}
|
||||
|
||||
public boolean containsRealm( Artifact extensionArtifact )
|
||||
{
|
||||
String id = createRealmId( extensionArtifact );
|
||||
return componentRealms.containsKey( id );
|
||||
}
|
||||
|
||||
public boolean containsRealm( Plugin plugin )
|
||||
{
|
||||
String id = createRealmId( plugin );
|
||||
return componentRealms.containsKey( id );
|
||||
}
|
||||
|
||||
public ClassRealm getProjectRealm()
|
||||
{
|
||||
return projectRealm;
|
||||
}
|
||||
|
||||
public ClassRealm createExtensionRealm( Artifact extensionArtifact )
|
||||
throws DuplicateRealmException
|
||||
{
|
||||
String realmId = MavenProjectSession.createRealmId( extensionArtifact );
|
||||
ClassRealm extRealm = container.getContainerRealm().createChildRealm( projectId + "/" + realmId );
|
||||
|
||||
componentRealms.put( realmId, extRealm );
|
||||
|
||||
return extRealm;
|
||||
}
|
||||
|
||||
public static String createProjectId( String groupId,
|
||||
String artifactId,
|
||||
String version )
|
||||
{
|
||||
return groupId + ":" + artifactId + ":" + version;
|
||||
}
|
||||
|
||||
public ClassRealm getComponentRealm( String key )
|
||||
{
|
||||
return (ClassRealm) componentRealms.get( key );
|
||||
}
|
||||
|
||||
|
||||
public ClassRealm createPluginRealm( Plugin projectPlugin )
|
||||
throws DuplicateRealmException
|
||||
{
|
||||
String realmId = MavenProjectSession.createRealmId( projectPlugin );
|
||||
ClassRealm extRealm = projectRealm.createChildRealm( realmId );
|
||||
|
||||
componentRealms.put( realmId, extRealm );
|
||||
|
||||
return extRealm;
|
||||
}
|
||||
|
||||
public static String createRealmId( Plugin plugin )
|
||||
{
|
||||
return ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() );
|
||||
}
|
||||
|
||||
public static String createRealmId( PluginDescriptor pd )
|
||||
{
|
||||
return ArtifactUtils.versionlessKey( pd.getGroupId(), pd.getArtifactId() );
|
||||
}
|
||||
|
||||
public ClassRealm getPluginRealm( PluginDescriptor pluginDescriptor )
|
||||
throws NoSuchRealmException
|
||||
{
|
||||
String realmId = MavenProjectSession.createRealmId( pluginDescriptor );
|
||||
ClassRealm extRealm = projectRealm.getWorld().getRealm( realmId );
|
||||
|
||||
componentRealms.put( realmId, extRealm );
|
||||
|
||||
return extRealm;
|
||||
}
|
||||
|
||||
}
|
|
@ -27,7 +27,6 @@ import org.apache.maven.settings.Settings;
|
|||
import org.codehaus.plexus.PlexusContainer;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
@ -52,10 +51,13 @@ public class MavenSession
|
|||
|
||||
private Map reports = new LinkedHashMap();
|
||||
|
||||
private final Map projectSessions;
|
||||
|
||||
public MavenSession( PlexusContainer container,
|
||||
MavenExecutionRequest request,
|
||||
EventDispatcher eventDispatcher,
|
||||
ReactorManager reactorManager )
|
||||
ReactorManager reactorManager,
|
||||
Map projectSessions )
|
||||
{
|
||||
this.container = container;
|
||||
|
||||
|
@ -64,6 +66,15 @@ public class MavenSession
|
|||
this.eventDispatcher = eventDispatcher;
|
||||
|
||||
this.reactorManager = reactorManager;
|
||||
|
||||
this.projectSessions = projectSessions;
|
||||
}
|
||||
|
||||
public MavenProjectSession getProjectSession( MavenProject project )
|
||||
{
|
||||
String id = MavenProjectSession.createProjectId( project.getGroupId(), project.getArtifactId(), project.getVersion() );
|
||||
|
||||
return (MavenProjectSession) projectSessions.get( id );
|
||||
}
|
||||
|
||||
public Map getPluginContext( PluginDescriptor pluginDescriptor,
|
||||
|
|
|
@ -56,7 +56,7 @@ public class ReactorManager
|
|||
public ReactorManager( List projects, String failureBehavior )
|
||||
throws CycleDetectedException, DuplicateProjectException
|
||||
{
|
||||
this.sorter = new ProjectSorter( projects );
|
||||
sorter = new ProjectSorter( projects );
|
||||
|
||||
if ( failureBehavior == null )
|
||||
{
|
||||
|
@ -108,7 +108,7 @@ public class ReactorManager
|
|||
|
||||
List dependents = sorter.getDependents( id );
|
||||
|
||||
if ( dependents != null && !dependents.isEmpty() )
|
||||
if ( ( dependents != null ) && !dependents.isEmpty() )
|
||||
{
|
||||
for ( Iterator it = dependents.iterator(); it.hasNext(); )
|
||||
{
|
||||
|
|
|
@ -24,16 +24,23 @@ import org.apache.maven.profiles.ProfileManager;
|
|||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface BuildExtensionScanner
|
||||
{
|
||||
|
||||
String ROLE = BuildExtensionScanner.class.getName();
|
||||
|
||||
void scanForBuildExtensions( List files, ArtifactRepository localRepository, ProfileManager globalProfileManager )
|
||||
void scanForBuildExtensions( List files,
|
||||
ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager,
|
||||
Map projectSessions )
|
||||
throws ExtensionScanningException;
|
||||
|
||||
void scanForBuildExtensions( File pom, ArtifactRepository localRepository, ProfileManager globalProfileManager )
|
||||
void scanForBuildExtensions( File pom,
|
||||
ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager,
|
||||
Map projectSessions )
|
||||
throws ExtensionScanningException;
|
||||
|
||||
}
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.apache.maven.extension;
|
|||
|
||||
import org.apache.maven.artifact.ArtifactUtils;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
||||
import org.apache.maven.context.BuildContextManager;
|
||||
import org.apache.maven.model.Build;
|
||||
import org.apache.maven.model.Extension;
|
||||
|
@ -38,7 +36,6 @@ import org.apache.maven.project.build.model.ModelLineageBuilder;
|
|||
import org.apache.maven.project.build.model.ModelLineageIterator;
|
||||
import org.apache.maven.project.interpolation.ModelInterpolationException;
|
||||
import org.apache.maven.project.interpolation.ModelInterpolator;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.logging.LogEnabled;
|
||||
import org.codehaus.plexus.logging.Logger;
|
||||
import org.codehaus.plexus.logging.console.ConsoleLogger;
|
||||
|
@ -69,8 +66,10 @@ public class DefaultBuildExtensionScanner
|
|||
|
||||
private ModelInterpolator modelInterpolator;
|
||||
|
||||
public void scanForBuildExtensions( List files, ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager )
|
||||
public void scanForBuildExtensions( List files,
|
||||
ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager,
|
||||
Map projectSessions )
|
||||
throws ExtensionScanningException
|
||||
{
|
||||
List visited = new ArrayList();
|
||||
|
@ -79,21 +78,27 @@ public class DefaultBuildExtensionScanner
|
|||
{
|
||||
File pom = (File) it.next();
|
||||
|
||||
scanInternal( pom, localRepository, globalProfileManager, visited, files );
|
||||
scanInternal( pom, localRepository, globalProfileManager, visited, files, projectSessions );
|
||||
}
|
||||
}
|
||||
|
||||
public void scanForBuildExtensions( File pom, ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager )
|
||||
public void scanForBuildExtensions( File pom,
|
||||
ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager,
|
||||
Map projectSessions )
|
||||
throws ExtensionScanningException
|
||||
{
|
||||
scanInternal( pom, localRepository, globalProfileManager, new ArrayList(), Collections.singletonList( pom ) );
|
||||
scanInternal( pom, localRepository, globalProfileManager, new ArrayList(), Collections.singletonList( pom ), projectSessions );
|
||||
}
|
||||
|
||||
// TODO: Use a build-context cache object for visitedModelIdx and reactorFiles,
|
||||
// once we move to just-in-time project scanning.
|
||||
private void scanInternal( File pom, ArtifactRepository localRepository, ProfileManager globalProfileManager,
|
||||
List visitedModelIds, List reactorFiles )
|
||||
private void scanInternal( File pom,
|
||||
ArtifactRepository localRepository,
|
||||
ProfileManager globalProfileManager,
|
||||
List visitedModelIds,
|
||||
List reactorFiles,
|
||||
Map projectSessions )
|
||||
throws ExtensionScanningException
|
||||
{
|
||||
|
||||
|
@ -150,7 +155,7 @@ public class DefaultBuildExtensionScanner
|
|||
|
||||
model = modelInterpolator.interpolate( model, inheritedInterpolationValues, false );
|
||||
|
||||
checkModelBuildForExtensions( model, localRepository, inheritedRemoteRepositories );
|
||||
checkModelBuildForExtensions( model, localRepository, inheritedRemoteRepositories, projectSessions );
|
||||
|
||||
if ( !reactorFiles.contains( modelPom ) )
|
||||
{
|
||||
|
@ -160,8 +165,14 @@ public class DefaultBuildExtensionScanner
|
|||
}
|
||||
else
|
||||
{
|
||||
checkModulesForExtensions( modelPom, model, localRepository, originalRemoteRepositories,
|
||||
globalProfileManager, visitedModelIds, reactorFiles );
|
||||
checkModulesForExtensions( modelPom,
|
||||
model,
|
||||
localRepository,
|
||||
originalRemoteRepositories,
|
||||
globalProfileManager,
|
||||
visitedModelIds,
|
||||
reactorFiles,
|
||||
projectSessions );
|
||||
}
|
||||
|
||||
Properties modelProps = model.getProperties();
|
||||
|
@ -173,12 +184,12 @@ public class DefaultBuildExtensionScanner
|
|||
|
||||
getLogger().debug( "Finished pre-scanning: " + pom + " for build extensions." );
|
||||
|
||||
extensionManager.registerWagons();
|
||||
extensionManager.registerWagons( projectSessions );
|
||||
}
|
||||
catch ( ModelInterpolationException e )
|
||||
{
|
||||
throw new ExtensionScanningException( "Failed to interpolate model from: " + pom
|
||||
+ " prior to scanning for extensions.", e );
|
||||
+ " prior to scanning for extensions.", pom, e );
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
@ -202,9 +213,14 @@ public class DefaultBuildExtensionScanner
|
|||
return groupId + ":" + artifactId;
|
||||
}
|
||||
|
||||
private void checkModulesForExtensions( File containingPom, Model model, ArtifactRepository localRepository,
|
||||
List originalRemoteRepositories, ProfileManager globalProfileManager,
|
||||
List visitedModelIds, List reactorFiles )
|
||||
private void checkModulesForExtensions( File containingPom,
|
||||
Model model,
|
||||
ArtifactRepository localRepository,
|
||||
List originalRemoteRepositories,
|
||||
ProfileManager globalProfileManager,
|
||||
List visitedModelIds,
|
||||
List reactorFiles,
|
||||
Map projectSessions )
|
||||
throws ExtensionScanningException
|
||||
{
|
||||
// FIXME: This gets a little sticky, because modules can be added by profiles that require
|
||||
|
@ -250,7 +266,7 @@ public class DefaultBuildExtensionScanner
|
|||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new ExtensionScanningException( "Error getting canonical path for modulePomDirectory.", e );
|
||||
throw new ExtensionScanningException( "Error getting canonical path for modulePomDirectory.", containingPom, moduleSubpath, e );
|
||||
}
|
||||
|
||||
if ( modulePomDirectory.isDirectory() )
|
||||
|
@ -270,12 +286,12 @@ public class DefaultBuildExtensionScanner
|
|||
continue;
|
||||
}
|
||||
|
||||
scanInternal( modulePomDirectory, localRepository, globalProfileManager, visitedModelIds, reactorFiles );
|
||||
scanInternal( modulePomDirectory, localRepository, globalProfileManager, visitedModelIds, reactorFiles, projectSessions );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkModelBuildForExtensions( Model model, ArtifactRepository localRepository, List remoteRepositories )
|
||||
private void checkModelBuildForExtensions( Model model, ArtifactRepository localRepository, List remoteRepositories, Map projectSessions )
|
||||
throws ExtensionScanningException
|
||||
{
|
||||
Build build = model.getBuild();
|
||||
|
@ -299,22 +315,12 @@ public class DefaultBuildExtensionScanner
|
|||
|
||||
try
|
||||
{
|
||||
extensionManager.addExtension( extension, model, remoteRepositories, localRepository );
|
||||
extensionManager.addExtension( extension, model, remoteRepositories, localRepository, projectSessions );
|
||||
}
|
||||
catch ( ArtifactResolutionException e )
|
||||
catch ( ExtensionManagerException e )
|
||||
{
|
||||
throw new ExtensionScanningException( "Cannot resolve pre-scanned extension artifact: "
|
||||
+ extension.getGroupId() + ":" + extension.getArtifactId() + ": " + e.getMessage(), e );
|
||||
}
|
||||
catch ( ArtifactNotFoundException e )
|
||||
{
|
||||
throw new ExtensionScanningException( "Cannot find pre-scanned extension artifact: "
|
||||
+ extension.getGroupId() + ":" + extension.getArtifactId() + ": " + e.getMessage(), e );
|
||||
}
|
||||
catch ( PlexusContainerException e )
|
||||
{
|
||||
throw new ExtensionScanningException( "Failed to add pre-scanned extension: "
|
||||
+ extension.getGroupId() + ":" + extension.getArtifactId() + ": " + e.getMessage(), e );
|
||||
+ extension.getGroupId() + ":" + extension.getArtifactId() + ": " + e.getMessage(), model, extension, e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -336,7 +342,7 @@ public class DefaultBuildExtensionScanner
|
|||
catch ( ProjectBuildingException e )
|
||||
{
|
||||
throw new ExtensionScanningException( "Error building model lineage in order to pre-scan for extensions: "
|
||||
+ e.getMessage(), e );
|
||||
+ e.getMessage(), pom, e );
|
||||
}
|
||||
|
||||
return lineage;
|
||||
|
|
|
@ -20,40 +20,55 @@ package org.apache.maven.extension;
|
|||
*/
|
||||
|
||||
import org.apache.maven.ArtifactFilterManager;
|
||||
import org.apache.maven.plugin.DefaultPluginManager;
|
||||
import org.apache.maven.artifact.Artifact;
|
||||
import org.apache.maven.artifact.ArtifactUtils;
|
||||
import org.apache.maven.artifact.versioning.VersionRange;
|
||||
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
||||
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
||||
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||
import org.apache.maven.artifact.manager.WagonManager;
|
||||
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
|
||||
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
||||
import org.apache.maven.artifact.metadata.ResolutionGroup;
|
||||
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolver;
|
||||
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
|
||||
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
||||
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
||||
import org.apache.maven.artifact.versioning.VersionRange;
|
||||
import org.apache.maven.execution.MavenProjectSession;
|
||||
import org.apache.maven.model.Extension;
|
||||
import org.apache.maven.model.Model;
|
||||
import org.apache.maven.model.Parent;
|
||||
import org.apache.maven.plugin.DefaultPluginManager;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
import org.codehaus.plexus.MutablePlexusContainer;
|
||||
import org.codehaus.plexus.PlexusConstants;
|
||||
import org.codehaus.plexus.PlexusContainer;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.classworlds.realm.ClassRealm;
|
||||
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
|
||||
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
|
||||
import org.codehaus.plexus.component.discovery.ComponentDiscoverer;
|
||||
import org.codehaus.plexus.component.discovery.ComponentDiscovererManager;
|
||||
import org.codehaus.plexus.component.discovery.ComponentDiscoveryEvent;
|
||||
import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
|
||||
import org.codehaus.plexus.component.discovery.DefaultComponentDiscoverer;
|
||||
import org.codehaus.plexus.component.repository.ComponentDescriptor;
|
||||
import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
|
||||
import org.codehaus.plexus.configuration.PlexusConfigurationException;
|
||||
import org.codehaus.plexus.context.Context;
|
||||
import org.codehaus.plexus.context.ContextException;
|
||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* Used to locate extensions.
|
||||
|
@ -73,7 +88,7 @@ public class DefaultExtensionManager
|
|||
|
||||
private ArtifactMetadataSource artifactMetadataSource;
|
||||
|
||||
private PlexusContainer container;
|
||||
private MutablePlexusContainer container;
|
||||
|
||||
private ArtifactFilterManager artifactFilterManager;
|
||||
|
||||
|
@ -82,8 +97,8 @@ public class DefaultExtensionManager
|
|||
public void addExtension( Extension extension,
|
||||
Model originatingModel,
|
||||
List remoteRepositories,
|
||||
ArtifactRepository localRepository )
|
||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException
|
||||
ArtifactRepository localRepository, Map projectSessions )
|
||||
throws ExtensionManagerException
|
||||
{
|
||||
Artifact extensionArtifact = artifactFactory.createBuildArtifact( extension.getGroupId(),
|
||||
extension.getArtifactId(),
|
||||
|
@ -109,13 +124,19 @@ public class DefaultExtensionManager
|
|||
|
||||
Artifact projectArtifact = artifactFactory.createProjectArtifact( groupId, artifactId, version );
|
||||
|
||||
addExtension( extensionArtifact, projectArtifact, remoteRepositories, localRepository, null );
|
||||
addExtension( extensionArtifact,
|
||||
projectArtifact,
|
||||
remoteRepositories,
|
||||
localRepository,
|
||||
null,
|
||||
projectSessions,
|
||||
MavenProjectSession.createProjectId( groupId, artifactId, version ) );
|
||||
}
|
||||
|
||||
public void addExtension( Extension extension,
|
||||
MavenProject project,
|
||||
ArtifactRepository localRepository )
|
||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException
|
||||
ArtifactRepository localRepository, Map projectSessions )
|
||||
throws ExtensionManagerException
|
||||
{
|
||||
String extensionId = ArtifactUtils.versionlessKey( extension.getGroupId(), extension.getArtifactId() );
|
||||
|
||||
|
@ -123,24 +144,47 @@ public class DefaultExtensionManager
|
|||
|
||||
Artifact artifact = (Artifact) project.getExtensionArtifactMap().get( extensionId );
|
||||
|
||||
addExtension( artifact, project.getArtifact(), project.getRemoteArtifactRepositories(),
|
||||
localRepository, new ActiveArtifactResolver( project ) );
|
||||
addExtension( artifact,
|
||||
project.getArtifact(),
|
||||
project.getRemoteArtifactRepositories(),
|
||||
localRepository,
|
||||
new ActiveArtifactResolver( project ),
|
||||
projectSessions,
|
||||
MavenProjectSession.createProjectId( project.getGroupId(), project.getArtifactId(), project.getVersion() ) );
|
||||
}
|
||||
|
||||
private void addExtension( Artifact extensionArtifact,
|
||||
Artifact projectArtifact,
|
||||
List remoteRepositories,
|
||||
ArtifactRepository localRepository, ActiveArtifactResolver activeArtifactResolver )
|
||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException
|
||||
ArtifactRepository localRepository,
|
||||
ActiveArtifactResolver activeArtifactResolver,
|
||||
Map projectSessions,
|
||||
String projectId )
|
||||
throws ExtensionManagerException
|
||||
{
|
||||
getLogger().debug( "Starting extension-addition process for: " + extensionArtifact );
|
||||
|
||||
if ( extensionArtifact != null )
|
||||
MavenProjectSession projectSession = (MavenProjectSession) projectSessions.get( projectId );
|
||||
if ( projectSession == null )
|
||||
{
|
||||
try
|
||||
{
|
||||
projectSession = new MavenProjectSession( projectId, container );
|
||||
}
|
||||
catch ( PlexusContainerException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Failed to create project realm for: " + projectId, projectId, e );
|
||||
}
|
||||
|
||||
projectSessions.put( projectId, projectSession );
|
||||
}
|
||||
|
||||
// if the extension is null, or if it's already been added to the current project-session, skip it.
|
||||
if ( ( extensionArtifact != null ) && !projectSession.containsRealm( extensionArtifact ) )
|
||||
{
|
||||
ArtifactFilter filter =
|
||||
new ProjectArtifactExceptionFilter( artifactFilterManager.getArtifactFilter(), projectArtifact );
|
||||
|
||||
|
||||
ResolutionGroup resolutionGroup;
|
||||
|
||||
try
|
||||
|
@ -149,8 +193,8 @@ public class DefaultExtensionManager
|
|||
}
|
||||
catch ( ArtifactMetadataRetrievalException e )
|
||||
{
|
||||
throw new ArtifactResolutionException( "Unable to download metadata from repository for plugin '" +
|
||||
extensionArtifact.getId() + "': " + e.getMessage(), extensionArtifact, e );
|
||||
throw new ExtensionManagerException( "Unable to download metadata from repository for extension artifact '" +
|
||||
extensionArtifact.getId() + "': " + e.getMessage(), extensionArtifact, projectId, e );
|
||||
}
|
||||
|
||||
// We use the same hack here to make sure that plexus 1.1 is available for extensions that do
|
||||
|
@ -162,10 +206,33 @@ public class DefaultExtensionManager
|
|||
dependencies.add( extensionArtifact );
|
||||
|
||||
// TODO: Make this work with managed dependencies, or an analogous management section in the POM.
|
||||
ArtifactResolutionResult result =
|
||||
artifactResolver.resolveTransitively( dependencies, projectArtifact,
|
||||
ArtifactResolutionResult result;
|
||||
try
|
||||
{
|
||||
result = artifactResolver.resolveTransitively( dependencies, projectArtifact,
|
||||
Collections.EMPTY_MAP, localRepository, remoteRepositories,
|
||||
artifactMetadataSource, filter );
|
||||
}
|
||||
catch ( ArtifactResolutionException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Unable to resolve one or more extension artifacts for: " + extensionArtifact.getId(), extensionArtifact, projectId, e );
|
||||
}
|
||||
catch ( ArtifactNotFoundException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "One or more extension artifacts is missing for: " + extensionArtifact.getId(), extensionArtifact, projectId, e );
|
||||
}
|
||||
|
||||
ClassRealm extensionRealm;
|
||||
try
|
||||
{
|
||||
extensionRealm = projectSession.createExtensionRealm( extensionArtifact );
|
||||
}
|
||||
catch ( DuplicateRealmException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Unable to create extension ClassRealm for extension: " + extensionArtifact.getId() + " within session for project: " + projectId, extensionArtifact, projectId, e );
|
||||
}
|
||||
|
||||
projectSession.addComponentRealm( extensionRealm );
|
||||
|
||||
for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); )
|
||||
{
|
||||
|
@ -176,24 +243,78 @@ public class DefaultExtensionManager
|
|||
a = activeArtifactResolver.replaceWithActiveArtifact( a );
|
||||
}
|
||||
|
||||
getLogger().debug( "Adding to extension classpath: " + a.getFile() + " in classRealm: " + container.getContainerRealm().getId() );
|
||||
getLogger().debug( "Adding to extension classpath: " + a.getFile() + " in classRealm: " + extensionRealm.getId() );
|
||||
|
||||
container.addJarResource( a.getFile() );
|
||||
|
||||
artifactFilterManager.excludeArtifact( a.getArtifactId() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void registerWagons()
|
||||
try
|
||||
{
|
||||
extensionRealm.addURL( a.getFile().toURL() );
|
||||
}
|
||||
catch ( MalformedURLException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Unable to generate URL from extension artifact file: " + a.getFile(), extensionArtifact, projectId, e );
|
||||
}
|
||||
}
|
||||
|
||||
ComponentDiscoverer discoverer = new DefaultComponentDiscoverer();
|
||||
discoverer.setManager( new DummyDiscovererManager() );
|
||||
|
||||
ClassRealm projectRealm = projectSession.getProjectRealm();
|
||||
try
|
||||
{
|
||||
List componentSetDescriptors = discoverer.findComponents( container.getContext(), extensionRealm );
|
||||
for ( Iterator it = componentSetDescriptors.iterator(); it.hasNext(); )
|
||||
{
|
||||
ComponentSetDescriptor compSet = (ComponentSetDescriptor) it.next();
|
||||
for ( Iterator compIt = compSet.getComponents().iterator(); compIt.hasNext(); )
|
||||
{
|
||||
ComponentDescriptor comp = (ComponentDescriptor) compIt.next();
|
||||
String implementation = comp.getImplementation();
|
||||
|
||||
try
|
||||
{
|
||||
getLogger().debug( "Importing: " + implementation + " from extension realm: " + extensionRealm.getId() + " to project realm: " + projectRealm.getId() );
|
||||
|
||||
projectRealm.importFrom( extensionRealm.getId(), implementation );
|
||||
|
||||
comp.setRealmId( projectRealm.getId() );
|
||||
container.addComponentDescriptor( comp );
|
||||
}
|
||||
catch ( NoSuchRealmException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Failed to create import for component: " + implementation + " from extension realm: " + extensionRealm.getId() + " to project realm: " + projectRealm.getId(), extensionArtifact, projectId, e );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( PlexusConfigurationException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Unable to discover extension components.", extensionArtifact, projectId, e );
|
||||
}
|
||||
catch ( ComponentRepositoryException e )
|
||||
{
|
||||
throw new ExtensionManagerException( "Unable to discover extension components from imports added to project-session realm.", extensionArtifact, projectId, e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void registerWagons( Map projectSessions )
|
||||
{
|
||||
for ( Iterator it = projectSessions.values().iterator(); it.hasNext(); )
|
||||
{
|
||||
MavenProjectSession projectSession = (MavenProjectSession) it.next();
|
||||
|
||||
ClassRealm oldRealm = container.setLookupRealm( projectSession.getProjectRealm() );
|
||||
|
||||
wagonManager.findAndRegisterWagons( container );
|
||||
|
||||
container.setLookupRealm( oldRealm );
|
||||
}
|
||||
}
|
||||
|
||||
public void contextualize( Context context )
|
||||
throws ContextException
|
||||
{
|
||||
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
|
||||
container = (MutablePlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
|
||||
}
|
||||
|
||||
private static final class ActiveArtifactResolver
|
||||
|
@ -282,4 +403,40 @@ public class DefaultExtensionManager
|
|||
Artifact.SCOPE_RUNTIME, "jar" ) );
|
||||
}
|
||||
}
|
||||
|
||||
private static final class DummyDiscovererManager implements ComponentDiscovererManager
|
||||
{
|
||||
|
||||
public void fireComponentDiscoveryEvent( ComponentDiscoveryEvent arg0 )
|
||||
{
|
||||
}
|
||||
|
||||
public List getComponentDiscoverers()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public Map getComponentDiscoveryListeners()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public List getListeners()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public void initialize()
|
||||
{
|
||||
}
|
||||
|
||||
public void registerComponentDiscoveryListener( ComponentDiscoveryListener arg0 )
|
||||
{
|
||||
}
|
||||
|
||||
public void removeComponentDiscoveryListener( ComponentDiscoveryListener arg0 )
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,14 +20,12 @@ package org.apache.maven.extension;
|
|||
*/
|
||||
|
||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
||||
import org.apache.maven.model.Extension;
|
||||
import org.apache.maven.model.Model;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Used to locate extensions.
|
||||
|
@ -37,12 +35,12 @@ import java.util.List;
|
|||
*/
|
||||
public interface ExtensionManager
|
||||
{
|
||||
void addExtension( Extension extension, MavenProject project, ArtifactRepository localRepository )
|
||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
|
||||
void addExtension( Extension extension, MavenProject project, ArtifactRepository localRepository, Map projectSessions )
|
||||
throws ExtensionManagerException;
|
||||
|
||||
void registerWagons();
|
||||
void registerWagons( Map projectSessions );
|
||||
|
||||
void addExtension( Extension extension, Model originatingModel, List remoteRepositories,
|
||||
ArtifactRepository localRepository )
|
||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
|
||||
ArtifactRepository localRepository, Map projectSessions )
|
||||
throws ExtensionManagerException;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
package org.apache.maven.extension;
|
||||
|
||||
import org.apache.maven.artifact.Artifact;
|
||||
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
||||
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
|
||||
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
|
||||
import org.codehaus.plexus.configuration.PlexusConfigurationException;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
|
||||
public class ExtensionManagerException
|
||||
extends Exception
|
||||
{
|
||||
|
||||
private Artifact extensionArtifact;
|
||||
private final String projectId;
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
ArtifactMetadataRetrievalException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
DuplicateRealmException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
ArtifactResolutionException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
ArtifactNotFoundException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
MalformedURLException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
PlexusConfigurationException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
String projectId,
|
||||
DuplicateRealmException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
NoSuchRealmException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
String projectId,
|
||||
PlexusContainerException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public ExtensionManagerException( String message,
|
||||
Artifact extensionArtifact,
|
||||
String projectId,
|
||||
ComponentRepositoryException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.extensionArtifact = extensionArtifact;
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
public Artifact getExtensionArtifact()
|
||||
{
|
||||
return extensionArtifact;
|
||||
}
|
||||
|
||||
public String getProjectId()
|
||||
{
|
||||
return projectId;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,13 @@
|
|||
package org.apache.maven.extension;
|
||||
|
||||
import org.apache.maven.model.Extension;
|
||||
import org.apache.maven.model.Model;
|
||||
import org.apache.maven.project.ProjectBuildingException;
|
||||
import org.apache.maven.project.interpolation.ModelInterpolationException;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
|
@ -23,14 +31,71 @@ public class ExtensionScanningException
|
|||
extends Exception
|
||||
{
|
||||
|
||||
public ExtensionScanningException( String message, Throwable cause )
|
||||
private File pomFile;
|
||||
private String extensionId;
|
||||
private String modelId;
|
||||
private String moduleSubpath;
|
||||
|
||||
public ExtensionScanningException( String message,
|
||||
File pomFile,
|
||||
ProjectBuildingException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.pomFile = pomFile;
|
||||
}
|
||||
|
||||
public ExtensionScanningException( String message,
|
||||
Model model,
|
||||
Extension extension,
|
||||
ExtensionManagerException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
modelId = model.getId();
|
||||
extensionId = extension.getGroupId() + ":" + extension.getArtifactId();
|
||||
}
|
||||
|
||||
public ExtensionScanningException( String message,
|
||||
ProjectBuildingException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
}
|
||||
|
||||
public ExtensionScanningException( String message )
|
||||
public ExtensionScanningException( String message,
|
||||
File pomFile,
|
||||
String moduleSubpath,
|
||||
IOException cause )
|
||||
{
|
||||
super( message );
|
||||
super( message, cause );
|
||||
this.pomFile = pomFile;
|
||||
this.moduleSubpath = moduleSubpath;
|
||||
}
|
||||
|
||||
public ExtensionScanningException( String message,
|
||||
File pomFile,
|
||||
ModelInterpolationException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
this.pomFile = pomFile;
|
||||
}
|
||||
|
||||
public File getPomFile()
|
||||
{
|
||||
return pomFile;
|
||||
}
|
||||
|
||||
public String getExtensionId()
|
||||
{
|
||||
return extensionId;
|
||||
}
|
||||
|
||||
public String getModelId()
|
||||
{
|
||||
return modelId;
|
||||
}
|
||||
|
||||
public String getModuleSubpath()
|
||||
{
|
||||
return moduleSubpath;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
|||
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
||||
import org.apache.maven.artifact.versioning.VersionRange;
|
||||
import org.apache.maven.context.BuildContextManager;
|
||||
import org.apache.maven.execution.MavenProjectSession;
|
||||
import org.apache.maven.execution.MavenSession;
|
||||
import org.apache.maven.execution.RuntimeInformation;
|
||||
import org.apache.maven.lifecycle.LifecycleExecutionContext;
|
||||
|
@ -60,10 +61,12 @@ import org.apache.maven.project.artifact.InvalidDependencyVersionException;
|
|||
import org.apache.maven.project.artifact.MavenMetadataSource;
|
||||
import org.apache.maven.project.path.PathTranslator;
|
||||
import org.apache.maven.reporting.MavenReport;
|
||||
import org.codehaus.plexus.MutablePlexusContainer;
|
||||
import org.codehaus.plexus.PlexusConstants;
|
||||
import org.codehaus.plexus.PlexusContainer;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.classworlds.realm.ClassRealm;
|
||||
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
|
||||
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
|
||||
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
|
||||
import org.codehaus.plexus.component.configurator.ComponentConfigurator;
|
||||
|
@ -72,7 +75,9 @@ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluatio
|
|||
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
|
||||
import org.codehaus.plexus.configuration.PlexusConfiguration;
|
||||
import org.codehaus.plexus.configuration.PlexusConfigurationException;
|
||||
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
|
||||
import org.codehaus.plexus.context.Context;
|
||||
import org.codehaus.plexus.context.ContextException;
|
||||
|
@ -81,6 +86,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
|
|||
import org.codehaus.plexus.util.StringUtils;
|
||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
@ -106,7 +112,7 @@ public class DefaultPluginManager
|
|||
RESERVED_GROUP_IDS = rgids;
|
||||
}
|
||||
|
||||
protected PlexusContainer container;
|
||||
protected MutablePlexusContainer container;
|
||||
|
||||
protected PluginDescriptorBuilder pluginDescriptorBuilder;
|
||||
|
||||
|
@ -189,21 +195,11 @@ public class DefaultPluginManager
|
|||
throws PluginVersionResolutionException, ArtifactNotFoundException,
|
||||
ArtifactResolutionException, InvalidPluginException,
|
||||
PluginManagerException, PluginNotFoundException
|
||||
{
|
||||
ArtifactRepository localRepository = session.getLocalRepository();
|
||||
|
||||
return verifyVersionedPlugin( plugin, project, localRepository );
|
||||
}
|
||||
|
||||
private PluginDescriptor verifyVersionedPlugin( Plugin plugin,
|
||||
MavenProject project,
|
||||
ArtifactRepository localRepository )
|
||||
throws PluginVersionResolutionException, ArtifactNotFoundException,
|
||||
ArtifactResolutionException, InvalidPluginException,
|
||||
PluginManagerException, PluginNotFoundException
|
||||
{
|
||||
getLogger().debug( "In verifyVersionedPlugin for: " + plugin.getKey() );
|
||||
|
||||
ArtifactRepository localRepository = session.getLocalRepository();
|
||||
|
||||
// TODO: this might result in an artifact "RELEASE" being resolved continuously
|
||||
// FIXME: need to find out how a plugin gets marked as 'installed'
|
||||
// and no ChildContainer exists. The check for that below fixes
|
||||
|
@ -241,7 +237,7 @@ public class DefaultPluginManager
|
|||
artifactResolver.resolve( pluginArtifact, project.getPluginArtifactRepositories(),
|
||||
localRepository );
|
||||
|
||||
addPlugin( plugin, pluginArtifact, project, localRepository );
|
||||
addPlugin( plugin, pluginArtifact, project, session );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -323,32 +319,6 @@ public class DefaultPluginManager
|
|||
}
|
||||
}
|
||||
|
||||
protected void addPlugin( Plugin plugin,
|
||||
Artifact pluginArtifact,
|
||||
MavenProject project,
|
||||
ArtifactRepository localRepository )
|
||||
throws ArtifactNotFoundException, ArtifactResolutionException, PluginManagerException,
|
||||
InvalidPluginException
|
||||
{
|
||||
// ----------------------------------------------------------------------------
|
||||
// Get the dependencies for the Plugin
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the only Plugin instance which will have dependencies is the one specified in the project.
|
||||
// We need to look for a Plugin instance there, in case the instance we're using didn't come from
|
||||
// the project.
|
||||
Plugin projectPlugin = (Plugin) project.getBuild().getPluginsAsMap().get( plugin.getKey() );
|
||||
|
||||
if ( projectPlugin == null )
|
||||
{
|
||||
projectPlugin = plugin;
|
||||
}
|
||||
|
||||
Set artifacts = getPluginArtifacts( pluginArtifact, projectPlugin, project, localRepository );
|
||||
|
||||
addPlugin( plugin, projectPlugin, pluginArtifact, artifacts );
|
||||
}
|
||||
|
||||
protected void addPlugin( Plugin plugin,
|
||||
Artifact pluginArtifact,
|
||||
MavenProject project,
|
||||
|
@ -373,24 +343,26 @@ public class DefaultPluginManager
|
|||
Set artifacts = getPluginArtifacts( pluginArtifact, projectPlugin, project,
|
||||
session.getLocalRepository() );
|
||||
|
||||
addPlugin( plugin, projectPlugin, pluginArtifact, artifacts );
|
||||
}
|
||||
String key = projectPlugin.getKey();
|
||||
|
||||
private void addPlugin( Plugin plugin,
|
||||
Plugin projectPlugin,
|
||||
Artifact pluginArtifact,
|
||||
Set artifacts )
|
||||
throws ArtifactNotFoundException, ArtifactResolutionException, PluginManagerException,
|
||||
InvalidPluginException
|
||||
ClassRealm pluginRealm;
|
||||
|
||||
// if we have a project session, it must mean we have extensions...
|
||||
// which in turn may alter the execution of a plugin.
|
||||
MavenProjectSession projectSession = session.getProjectSession( project );
|
||||
if ( projectSession != null )
|
||||
{
|
||||
// TODO When/if we go to project-level plugin instances (like for plugin-level deps in the
|
||||
// POM), we need to undo this somehow.
|
||||
ClassRealm pluginRealm = container.getComponentRealm( projectPlugin.getKey() );
|
||||
pluginRealm = projectSession.getComponentRealm( key );
|
||||
}
|
||||
else
|
||||
{
|
||||
pluginRealm = container.getComponentRealm( key );
|
||||
}
|
||||
|
||||
if ( ( pluginRealm != null ) && ( pluginRealm != container.getContainerRealm() ) )
|
||||
{
|
||||
getLogger().debug(
|
||||
"Realm already exists for: " + projectPlugin.getKey()
|
||||
"Realm already exists for: " + key
|
||||
+ ". Skipping addition..." );
|
||||
// we've already discovered this plugin, and configured it, so skip it this time.
|
||||
|
||||
|
@ -404,6 +376,50 @@ public class DefaultPluginManager
|
|||
ClassRealm componentRealm = null;
|
||||
|
||||
try
|
||||
{
|
||||
if ( projectSession != null )
|
||||
{
|
||||
componentRealm = projectSession.createPluginRealm( projectPlugin );
|
||||
|
||||
try
|
||||
{
|
||||
componentRealm.addURL( pluginArtifact.getFile().toURI().toURL() );
|
||||
}
|
||||
catch ( MalformedURLException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Error rendering plugin artifact: " + pluginArtifact.getId() + " as URL.", e );
|
||||
}
|
||||
|
||||
for ( Iterator i = artifacts.iterator(); i.hasNext(); )
|
||||
{
|
||||
Artifact artifact = (Artifact) i.next();
|
||||
|
||||
try
|
||||
{
|
||||
getLogger().debug( "Adding: " + artifact.getId() + " to plugin class-realm: " + key + " in project-session: " + project.getId() );
|
||||
componentRealm.addURL( artifact.getFile().toURI().toURL() );
|
||||
}
|
||||
catch ( MalformedURLException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Error rendering plugin artifact: " + artifact.getId() + " as URL.", e );
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
getLogger().debug( "Discovering components in realm: " + componentRealm );
|
||||
container.discoverComponents( componentRealm, false );
|
||||
}
|
||||
catch ( PlexusConfigurationException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Error re-scanning project realm for components.", e );
|
||||
}
|
||||
catch ( ComponentRepositoryException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Error re-scanning project realm for components.", e );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
List jars = new ArrayList();
|
||||
|
||||
|
@ -417,10 +433,24 @@ public class DefaultPluginManager
|
|||
jars.add( pluginArtifact.getFile() );
|
||||
|
||||
// Now here we need the artifact coreArtifactFilter stuff
|
||||
componentRealm = container.createComponentRealm( key, jars );
|
||||
}
|
||||
|
||||
componentRealm = container.createComponentRealm( projectPlugin.getKey(), jars );
|
||||
}
|
||||
catch ( PlexusContainerException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Failed to create realm for plugin '" + projectPlugin
|
||||
+ ".", e );
|
||||
}
|
||||
catch ( DuplicateRealmException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Failed to create project-specific realm for plugin '" + projectPlugin
|
||||
+ " in project: " + project.getId(), e );
|
||||
}
|
||||
|
||||
String parentRealmId = componentRealm.getParentRealm().getId();
|
||||
try
|
||||
{
|
||||
String parentRealmId = container.getContainerRealm().getId();
|
||||
|
||||
// adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils)
|
||||
// spawning a ClassCastException when a mojo calls plugin.getConfiguration() from maven-model...
|
||||
|
@ -435,11 +465,6 @@ public class DefaultPluginManager
|
|||
// (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and probably others)
|
||||
componentRealm.importFrom( parentRealmId, "/default-report.xml" );
|
||||
}
|
||||
catch ( PlexusContainerException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm, "Failed to create realm for plugin '" + projectPlugin
|
||||
+ ".", e );
|
||||
}
|
||||
catch ( NoSuchRealmException e )
|
||||
{
|
||||
throw new PluginContainerException( plugin, componentRealm,
|
||||
|
@ -767,7 +792,24 @@ public class DefaultPluginManager
|
|||
|
||||
Mojo plugin;
|
||||
|
||||
ClassRealm realm = mojoDescriptor.getPluginDescriptor().getClassRealm();
|
||||
ClassRealm realm = null;
|
||||
|
||||
MavenProjectSession projectSession = session.getProjectSession( project );
|
||||
if ( projectSession != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
realm = projectSession.getPluginRealm( pluginDescriptor );
|
||||
}
|
||||
catch ( NoSuchRealmException e )
|
||||
{
|
||||
throw new PluginManagerException( mojoDescriptor, project, "Plugin realm: " + pluginDescriptor.getId() + " not found in project session for: " + project.getId(), e );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
realm = mojoDescriptor.getPluginDescriptor().getClassRealm();
|
||||
}
|
||||
|
||||
// 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
|
||||
|
@ -1329,7 +1371,7 @@ public class DefaultPluginManager
|
|||
public void contextualize( Context context )
|
||||
throws ContextException
|
||||
{
|
||||
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
|
||||
container = (MutablePlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
|
||||
|
||||
mojoLogger = new DefaultLog( container.getLoggerManager().getLoggerForComponent( Mojo.ROLE ) );
|
||||
}
|
||||
|
|
|
@ -4,8 +4,13 @@ import org.apache.maven.model.Plugin;
|
|||
import org.apache.maven.plugin.descriptor.MojoDescriptor;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.classworlds.realm.ClassRealm;
|
||||
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
|
||||
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
|
||||
import org.codehaus.plexus.configuration.PlexusConfigurationException;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
|
||||
/**
|
||||
* Exception which occurs to indicate that the plugin cannot be initialized due
|
||||
|
@ -53,6 +58,46 @@ public class PluginContainerException
|
|||
this.pluginRealm = pluginRealm;
|
||||
}
|
||||
|
||||
public PluginContainerException( Plugin plugin,
|
||||
ClassRealm pluginRealm,
|
||||
String message,
|
||||
DuplicateRealmException e )
|
||||
{
|
||||
super( plugin, message, e );
|
||||
|
||||
this.pluginRealm = pluginRealm;
|
||||
}
|
||||
|
||||
public PluginContainerException( Plugin plugin,
|
||||
ClassRealm pluginRealm,
|
||||
String message,
|
||||
MalformedURLException e )
|
||||
{
|
||||
super( plugin, message, e );
|
||||
|
||||
this.pluginRealm = pluginRealm;
|
||||
}
|
||||
|
||||
public PluginContainerException( Plugin plugin,
|
||||
ClassRealm pluginRealm,
|
||||
String message,
|
||||
PlexusConfigurationException e )
|
||||
{
|
||||
super( plugin, message, e );
|
||||
|
||||
this.pluginRealm = pluginRealm;
|
||||
}
|
||||
|
||||
public PluginContainerException( Plugin plugin,
|
||||
ClassRealm pluginRealm,
|
||||
String message,
|
||||
ComponentRepositoryException e )
|
||||
{
|
||||
super( plugin, message, e );
|
||||
|
||||
this.pluginRealm = pluginRealm;
|
||||
}
|
||||
|
||||
public ClassRealm getPluginRealm()
|
||||
{
|
||||
return pluginRealm;
|
||||
|
|
|
@ -3,9 +3,15 @@ package org.apache.maven.plugin;
|
|||
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
||||
import org.apache.maven.model.Plugin;
|
||||
import org.apache.maven.plugin.descriptor.MojoDescriptor;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
|
||||
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
|
||||
import org.codehaus.plexus.configuration.PlexusConfigurationException;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
|
@ -44,6 +50,8 @@ public class PluginManagerException
|
|||
|
||||
private String goal;
|
||||
|
||||
private MavenProject project;
|
||||
|
||||
protected PluginManagerException( Plugin plugin,
|
||||
String message,
|
||||
PlexusContainerException cause )
|
||||
|
@ -86,6 +94,64 @@ public class PluginManagerException
|
|||
pluginVersion = plugin.getVersion();
|
||||
}
|
||||
|
||||
protected PluginManagerException( Plugin plugin,
|
||||
String message,
|
||||
DuplicateRealmException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
|
||||
pluginGroupId = plugin.getGroupId();
|
||||
pluginArtifactId = plugin.getArtifactId();
|
||||
pluginVersion = plugin.getVersion();
|
||||
}
|
||||
|
||||
protected PluginManagerException( Plugin plugin,
|
||||
String message,
|
||||
MalformedURLException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
|
||||
pluginGroupId = plugin.getGroupId();
|
||||
pluginArtifactId = plugin.getArtifactId();
|
||||
pluginVersion = plugin.getVersion();
|
||||
}
|
||||
|
||||
public PluginManagerException( Plugin plugin,
|
||||
String message,
|
||||
PlexusConfigurationException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
|
||||
pluginGroupId = plugin.getGroupId();
|
||||
pluginArtifactId = plugin.getArtifactId();
|
||||
pluginVersion = plugin.getVersion();
|
||||
}
|
||||
|
||||
public PluginManagerException( Plugin plugin,
|
||||
String message,
|
||||
ComponentRepositoryException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
|
||||
pluginGroupId = plugin.getGroupId();
|
||||
pluginArtifactId = plugin.getArtifactId();
|
||||
pluginVersion = plugin.getVersion();
|
||||
}
|
||||
|
||||
public PluginManagerException( MojoDescriptor mojoDescriptor,
|
||||
MavenProject project,
|
||||
String message,
|
||||
NoSuchRealmException cause )
|
||||
{
|
||||
super( message, cause );
|
||||
|
||||
this.project = project;
|
||||
pluginGroupId = mojoDescriptor.getPluginDescriptor().getGroupId();
|
||||
pluginArtifactId = mojoDescriptor.getPluginDescriptor().getArtifactId();
|
||||
pluginVersion = mojoDescriptor.getPluginDescriptor().getVersion();
|
||||
goal = mojoDescriptor.getGoal();
|
||||
}
|
||||
|
||||
public String getPluginGroupId()
|
||||
{
|
||||
return pluginGroupId;
|
||||
|
@ -105,4 +171,9 @@ public class PluginManagerException
|
|||
{
|
||||
return goal;
|
||||
}
|
||||
|
||||
public MavenProject getProject()
|
||||
{
|
||||
return project;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -230,7 +230,7 @@ public class PluginParameterExpressionEvaluatorTest
|
|||
.setLocalRepository( repo );
|
||||
|
||||
return new MavenSession( container, request, new DefaultEventDispatcher(),
|
||||
new ReactorManager( Collections.EMPTY_LIST, ReactorManager.FAIL_FAST ) );
|
||||
new ReactorManager( Collections.EMPTY_LIST, ReactorManager.FAIL_FAST ), Collections.EMPTY_MAP );
|
||||
}
|
||||
|
||||
public void testLocalRepositoryExtraction()
|
||||
|
|
|
@ -208,6 +208,40 @@ under the License.
|
|||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>shade-maven-plugin</artifactId>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<version>1.0-alpha-12</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<!-- The IDEA folks don't want to put SNAPSHOT libs in their projects even though they are -->
|
||||
<finalName>maven-embedder-std-2.1</finalName>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
<keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
|
||||
<transformers>
|
||||
<transformer implementation="org.codehaus.mojo.shade.resource.ComponentsXmlResourceTransformer"/>
|
||||
</transformers>
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>org.codehaus.plexus.util</pattern>
|
||||
<excludes>
|
||||
<exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
|
||||
<exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
|
||||
</excludes>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>org.jdom</pattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>2.2-beta-1</version>
|
||||
|
|
|
@ -43,6 +43,7 @@ under the License.
|
|||
<exclude>org.apache.maven:maven-artifact</exclude>
|
||||
<exclude>org.apache.maven:maven-monitor</exclude>
|
||||
<exclude>org.apache.maven:maven-plugin-descriptor</exclude>
|
||||
<exclude>jdom:jdom</exclude>
|
||||
</excludes>
|
||||
</dependencySet>
|
||||
</dependencySets>
|
||||
|
@ -81,7 +82,7 @@ under the License.
|
|||
<directory>target</directory>
|
||||
<outputDirectory>lib</outputDirectory>
|
||||
<includes>
|
||||
<include>maven*.jar</include>
|
||||
<include>maven-embedder-std*.jar</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
</fileSets>
|
||||
|
|
|
@ -92,52 +92,66 @@ public class CLIManager
|
|||
{
|
||||
options = new Options();
|
||||
|
||||
options.addOption( OptionBuilder.hasArg( true ).create( ALTERNATE_POM_FILE ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "file" ).hasArg().withDescription(
|
||||
"Force the use of an alternate POM file." ).create( ALTERNATE_POM_FILE ) );
|
||||
|
||||
options.addOption(
|
||||
OptionBuilder.hasArg( true ).create(
|
||||
OptionBuilder.withLongOpt( "define" ).hasArg().withDescription( "Define a system property" ).create(
|
||||
SET_SYSTEM_PROPERTY ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create( OFFLINE ) );
|
||||
OptionBuilder.withLongOpt( "offline" ).withDescription( "Work offline" ).create( OFFLINE ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create( HELP ) );
|
||||
OptionBuilder.withLongOpt( "help" ).withDescription( "Display help information" ).create( HELP ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create(
|
||||
OptionBuilder.withLongOpt( "version" ).withDescription( "Display version information" ).create(
|
||||
VERSION ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create(
|
||||
OptionBuilder.withLongOpt( "quiet" ).withDescription( "Quiet output - only show errors" ).create(
|
||||
QUIET ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create(
|
||||
OptionBuilder.withLongOpt( "debug" ).withDescription( "Produce execution debug output" ).create(
|
||||
DEBUG ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create(
|
||||
OptionBuilder.withLongOpt( "errors" ).withDescription( "Produce execution error messages" ).create(
|
||||
ERRORS ) );
|
||||
options.addOption( OptionBuilder.create( REACTOR ) );
|
||||
options.addOption( OptionBuilder.create( NON_RECURSIVE ) );
|
||||
options.addOption( OptionBuilder.create( UPDATE_SNAPSHOTS ) );
|
||||
options.addOption( OptionBuilder.hasArg( true ).create( ACTIVATE_PROFILES ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "reactor" ).withDescription(
|
||||
"Execute goals for project found in the reactor" ).create( REACTOR ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "non-recursive" ).withDescription(
|
||||
"Do not recurse into sub-projects" ).create( NON_RECURSIVE ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "update-snapshots" ).withDescription(
|
||||
"Forces a check for updated releases and snapshots on remote repositories" ).create( UPDATE_SNAPSHOTS ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "activate-profiles" ).withDescription(
|
||||
"Comma-delimited list of profiles to activate" ).hasArg().create( ACTIVATE_PROFILES ) );
|
||||
|
||||
options.addOption( OptionBuilder.create( BATCH_MODE ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "batch-mode" ).withDescription(
|
||||
"Run in non-interactive (batch) mode" ).create( BATCH_MODE ) );
|
||||
|
||||
options.addOption( OptionBuilder.create( FORCE_PLUGIN_UPDATES ) );
|
||||
options.addOption( OptionBuilder.create( FORCE_PLUGIN_UPDATES2 ) );
|
||||
options.addOption( OptionBuilder.create( SUPPRESS_PLUGIN_UPDATES ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "check-plugin-updates" ).withDescription(
|
||||
"Force upToDate check for any relevant registered plugins" ).create( FORCE_PLUGIN_UPDATES ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "update-plugins" ).withDescription(
|
||||
"Synonym for " + FORCE_PLUGIN_UPDATES ).create( FORCE_PLUGIN_UPDATES2 ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "no-plugin-updates" ).withDescription(
|
||||
"Suppress upToDate check for any relevant registered plugins" ).create( SUPPRESS_PLUGIN_UPDATES ) );
|
||||
|
||||
options.addOption(OptionBuilder
|
||||
options.addOption(OptionBuilder.withLongOpt("no-snapshot-updates")
|
||||
.withDescription("Supress SNAPSHOT updates")
|
||||
.create(SUPRESS_SNAPSHOT_UPDATES));
|
||||
|
||||
options.addOption( OptionBuilder.create( SUPPRESS_PLUGIN_REGISTRY ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "no-plugin-registry" ).withDescription(
|
||||
"Don't use ~/.m2/plugin-registry.xml for plugin versions" ).create( SUPPRESS_PLUGIN_REGISTRY ) );
|
||||
|
||||
options.addOption( OptionBuilder.create( CHECKSUM_FAILURE_POLICY ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "strict-checksums" ).withDescription(
|
||||
"Fail the build if checksums don't match" ).create( CHECKSUM_FAILURE_POLICY ) );
|
||||
options.addOption(
|
||||
OptionBuilder.create(
|
||||
OptionBuilder.withLongOpt( "lax-checksums" ).withDescription( "Warn if checksums don't match" ).create(
|
||||
CHECKSUM_WARNING_POLICY ) );
|
||||
|
||||
options.addOption( OptionBuilder.hasArg( true )
|
||||
options.addOption( OptionBuilder.withLongOpt( "settings" )
|
||||
.withDescription( "Alternate path for the user settings file" ).hasArg()
|
||||
.create( ALTERNATE_USER_SETTINGS ) );
|
||||
|
||||
options.addOption( OptionBuilder.create( FAIL_FAST ) );
|
||||
options.addOption( OptionBuilder.withLongOpt( "fail-fast" ).withDescription(
|
||||
"Stop at first failure in reactorized builds" ).create( FAIL_FAST ) );
|
||||
|
||||
options.addOption( OptionBuilder.withLongOpt( "fail-at-end" ).withDescription(
|
||||
"Only fail the build afterwards; allow all non-impacted builds to continue" ).create( FAIL_AT_END ) );
|
||||
|
|
|
@ -38,6 +38,8 @@ import org.apache.maven.execution.MavenExecutionRequest;
|
|||
import org.apache.maven.execution.MavenExecutionResult;
|
||||
import org.apache.maven.execution.MavenSession;
|
||||
import org.apache.maven.execution.ReactorManager;
|
||||
import org.apache.maven.extension.BuildExtensionScanner;
|
||||
import org.apache.maven.extension.ExtensionScanningException;
|
||||
import org.apache.maven.lifecycle.LifecycleUtils;
|
||||
import org.apache.maven.model.Model;
|
||||
import org.apache.maven.model.Plugin;
|
||||
|
@ -127,6 +129,8 @@ public class MavenEmbedder
|
|||
|
||||
private MavenProjectBuilder mavenProjectBuilder;
|
||||
|
||||
private BuildExtensionScanner extensionScanner;
|
||||
|
||||
private MavenXpp3Reader modelReader;
|
||||
|
||||
private MavenJDOMWriter modelWriter;
|
||||
|
@ -323,7 +327,7 @@ public class MavenEmbedder
|
|||
{
|
||||
PluginManager pluginManager = (PluginManager) container.lookup( PluginManager.ROLE );
|
||||
|
||||
MavenSession session = new MavenSession( container, request, null, null );
|
||||
MavenSession session = new MavenSession( container, request, null, null, new HashMap() );
|
||||
|
||||
pluginManager.verifyPlugin( plugin, project, session );
|
||||
}
|
||||
|
@ -428,8 +432,12 @@ public class MavenEmbedder
|
|||
// ----------------------------------------------------------------------
|
||||
|
||||
public MavenProject readProject( File mavenProject )
|
||||
throws ProjectBuildingException
|
||||
throws ProjectBuildingException, ExtensionScanningException
|
||||
{
|
||||
getLogger().info( "Scanning for extensions: " + mavenProject );
|
||||
extensionScanner.scanForBuildExtensions( mavenProject, request.getLocalRepository(), request.getProfileManager(), new HashMap() );
|
||||
|
||||
getLogger().info( "Building MavenProject instance: " + mavenProject );
|
||||
return mavenProjectBuilder.build( mavenProject, request.getLocalRepository(), request.getProfileManager() );
|
||||
}
|
||||
|
||||
|
@ -474,8 +482,12 @@ public class MavenEmbedder
|
|||
{
|
||||
return result.addProjectBuildingException( e );
|
||||
}
|
||||
catch ( ExtensionScanningException e )
|
||||
{
|
||||
return result.addExtensionScanningException( e );
|
||||
}
|
||||
|
||||
ReactorManager reactorManager = maven.createReactorManager( request, result );
|
||||
ReactorManager reactorManager = maven.createReactorManager( request, result, new HashMap() );
|
||||
|
||||
if ( result.hasExceptions() )
|
||||
{
|
||||
|
@ -673,6 +685,8 @@ public class MavenEmbedder
|
|||
|
||||
mavenProjectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.ROLE );
|
||||
|
||||
extensionScanner = (BuildExtensionScanner) container.lookup( BuildExtensionScanner.ROLE );
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Artifact related components
|
||||
// ----------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue