From 6f141968464b4ad24e5d90f1389065141cda5e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Sat, 29 Jan 2022 18:09:47 +0100 Subject: [PATCH] [MNG-7400] Allow more WorkspaceReaders to participate This closes #668 --- .../java/org/apache/maven/DefaultMaven.java | 85 ++++++++++++------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index 7f052c139d75..12b8f4ac7b4e 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -232,26 +232,15 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSess return addExceptionToResult( result, e ); } - WorkspaceReader reactorWorkspace; try { - reactorWorkspace = container.lookup( WorkspaceReader.class, ReactorReader.HINT ); + setupWorkspaceReader( session, repoSession ); } catch ( ComponentLookupException e ) { return addExceptionToResult( result, e ); } - // - // Desired order of precedence for local artifact repositories - // - // Reactor - // Workspace - // User Local Repository - // - repoSession.setWorkspaceReader( ChainedWorkspaceReader.newInstance( reactorWorkspace, - repoSession.getWorkspaceReader() ) ); - repoSession.setReadOnly(); ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); @@ -326,6 +315,34 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSess return result; } + private void setupWorkspaceReader( MavenSession session, DefaultRepositorySystemSession repoSession ) + throws ComponentLookupException + { + // Desired order of precedence for workspace readers before querying the local artifact repositories + List workspaceReaders = new ArrayList(); + // 1) Reactor workspace reader + workspaceReaders.add( container.lookup( WorkspaceReader.class, ReactorReader.HINT ) ); + // 2) Repository system session-scoped workspace reader + WorkspaceReader repoWorkspaceReader = repoSession.getWorkspaceReader(); + if ( repoWorkspaceReader != null ) + { + workspaceReaders.add( repoWorkspaceReader ); + } + // 3) .. n) Project-scoped workspace readers + for ( WorkspaceReader workspaceReader : getProjectScopedExtensionComponents( session.getProjects(), + WorkspaceReader.class ) ) + { + if ( workspaceReaders.contains( workspaceReader ) ) + { + continue; + } + workspaceReaders.add( workspaceReader ); + } + WorkspaceReader[] readers = workspaceReaders.toArray( new WorkspaceReader[0] ); + repoSession.setWorkspaceReader( new ChainedWorkspaceReader( readers ) ); + + } + private void afterSessionEnd( Collection projects, MavenSession session ) throws MavenExecutionException { @@ -369,47 +386,57 @@ private Collection getLifecycleParticipants( { Collection lifecycleListeners = new LinkedHashSet<>(); - ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); try { - try - { - lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) ); - } - catch ( ComponentLookupException e ) - { - // this is just silly, lookupList should return an empty list! - logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() ); - } + lifecycleListeners.addAll( container.lookupList( AbstractMavenLifecycleParticipant.class ) ); + } + catch ( ComponentLookupException e ) + { + // this is just silly, lookupList should return an empty list! + logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() ); + } + + lifecycleListeners.addAll( getProjectScopedExtensionComponents( projects, + AbstractMavenLifecycleParticipant.class ) ); - Collection scannedRealms = new HashSet<>(); + return lifecycleListeners; + } + protected Collection getProjectScopedExtensionComponents( Collection projects, Class role ) + { + + Collection foundComponents = new LinkedHashSet<>(); + Collection scannedRealms = new HashSet<>(); + + 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 ) ); + foundComponents.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() ); } } } + return foundComponents; } finally { - Thread.currentThread().setContextClassLoader( originalClassLoader ); + currentThread.setContextClassLoader( originalContextClassLoader ); } - - return lifecycleListeners; } private MavenExecutionResult addExceptionToResult( MavenExecutionResult result, Throwable e )