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..29603adf9c57 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -232,25 +232,40 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSess return addExceptionToResult( result, e ); } - WorkspaceReader reactorWorkspace; + List workspaceReaders = new ArrayList<>(); + WorkspaceReader repoWorkspaceReader = repoSession.getWorkspaceReader(); + // + // Desired order of precedence for local artifact repositories + // try { - reactorWorkspace = container.lookup( WorkspaceReader.class, ReactorReader.HINT ); + // Reactor + 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 ) + { + // IDE Workspace reader + workspaceReaders.add( repoWorkspaceReader ); + } + for ( WorkspaceReader workspaceReader : getProjectScopedExtensions( session.getProjects(), + WorkspaceReader.class ) ) + { + if ( workspaceReaders.contains( workspaceReader ) ) + { + continue; + } + // additional 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(); @@ -382,34 +397,50 @@ private Collection getLifecycleParticipants( logger.warn( "Failed to lookup lifecycle participants: " + e.getMessage() ); } - Collection scannedRealms = new HashSet<>(); + lifecycleListeners.addAll( getProjectScopedExtensions( projects, + AbstractMavenLifecycleParticipant.class ) ); + } + finally + { + Thread.currentThread().setContextClassLoader( originalClassLoader ); + } + + return lifecycleListeners; + } + protected Collection getProjectScopedExtensions( Collection projects, Class role ) + { + Collection scannedRealms = new HashSet<>(); + Collection 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 )