Skip to content

Commit

Permalink
Backport of MNG-7400 - Allow more WorkspaceReader's to participate
Browse files Browse the repository at this point in the history
  • Loading branch information
Christoph Läubrich committed Jan 31, 2022
1 parent 83257bf commit 0dab045
Showing 1 changed file with 48 additions and 17 deletions.
65 changes: 48 additions & 17 deletions maven-core/src/main/java/org/apache/maven/DefaultMaven.java
Original file line number Diff line number Diff line change
Expand Up @@ -232,25 +232,40 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSess
return addExceptionToResult( result, e );
}

WorkspaceReader reactorWorkspace;
List<WorkspaceReader> workspaceReaders = new ArrayList<>();
WorkspaceReader repoWorkspaceReader = repoSession.getWorkspaceReader();
//
// Desired order of precedence for local artifact repositories
//
try
{
reactorWorkspace = container.lookup( WorkspaceReader.class, ReactorReader.HINT );
// 1) Reactor workspace reader
workspaceReaders.add( container.lookup( WorkspaceReader.class, ReactorReader.HINT ) );
}
catch ( ComponentLookupException e )
{
return addExceptionToResult( result, e );
}

//
// Desired order of precedence for local artifact repositories
//
// Reactor
// Workspace
if ( repoWorkspaceReader != null )
{
// 2) Repository system session scoped workspace reader
workspaceReaders.add( repoWorkspaceReader );
}
for ( WorkspaceReader workspaceReader : getProjectScopedExtensions( session.getProjects(),
WorkspaceReader.class ) )
{
if ( workspaceReaders.contains( workspaceReader ) )
{
continue;
}
// 3) .. n) Project scoped workspace reader
workspaceReaders.add( workspaceReader );
}
// User Local Repository
//
repoSession.setWorkspaceReader( ChainedWorkspaceReader.newInstance( reactorWorkspace,
repoSession.getWorkspaceReader() ) );

WorkspaceReader[] readers = workspaceReaders.toArray( new WorkspaceReader[0] );
repoSession.setWorkspaceReader( new ChainedWorkspaceReader( readers ) );

repoSession.setReadOnly();

Expand Down Expand Up @@ -382,34 +397,50 @@ private Collection<AbstractMavenLifecycleParticipant> getLifecycleParticipants(
logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() );
}

Collection<ClassLoader> scannedRealms = new HashSet<>();
lifecycleListeners.addAll( getProjectScopedExtensions( projects,
AbstractMavenLifecycleParticipant.class ) );
}
finally
{
Thread.currentThread().setContextClassLoader( originalClassLoader );
}

return lifecycleListeners;
}

protected <T> Collection<T> getProjectScopedExtensions( Collection<MavenProject> projects, Class<T> role )
{
Collection<ClassLoader> scannedRealms = new HashSet<>();
Collection<T> extensions = new LinkedHashSet<>();
Thread currentThread = Thread.currentThread();
ClassLoader originalContextClassLoader = currentThread.getContextClassLoader();
try
{
for ( MavenProject project : projects )
{
ClassLoader projectRealm = project.getClassRealm();

if ( projectRealm != null && scannedRealms.add( projectRealm ) )
{
Thread.currentThread().setContextClassLoader( projectRealm );
currentThread.setContextClassLoader( projectRealm );

try
{
lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) );
extensions.addAll( container.lookupList( role ) );
}
catch ( ComponentLookupException e )
{
// this is just silly, lookupList should return an empty list!
logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() );
logger.warn( "Failed to lookup " + role + ": " + e.getMessage() );
}
}
}
}
finally
{
Thread.currentThread().setContextClassLoader( originalClassLoader );
currentThread.setContextClassLoader( originalContextClassLoader );
}

return lifecycleListeners;
return extensions;
}

private MavenExecutionResult addExceptionToResult( MavenExecutionResult result, Throwable e )
Expand Down

0 comments on commit 0dab045

Please sign in to comment.