diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java index b513d46190..4bf68102e0 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; @@ -28,6 +29,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; @@ -129,6 +132,14 @@ private void multiThreadedProjectTaskSegmentBuild( ConcurrencyDependencyGraph an Map projectBuildList, ThreadOutputMuxer muxer ) { + // gather artifactIds which are not unique so that the respective thread names can be extended with the groupId + Set duplicateArtifactIds = projectBuildList.keySet().stream() + .map( MavenProject::getArtifactId ) + .collect( Collectors.groupingBy( Function.identity(), Collectors.counting() ) ) + .entrySet().stream() + .filter( p -> p.getValue() > 1 ) + .map( Map.Entry::getKey ) + .collect( Collectors.toSet() ); // schedule independent projects for ( MavenProject mavenProject : analyzer.getRootSchedulableBuilds() ) @@ -136,7 +147,8 @@ private void multiThreadedProjectTaskSegmentBuild( ConcurrencyDependencyGraph an ProjectSegment projectSegment = projectBuildList.get( mavenProject ); logger.debug( "Scheduling: " + projectSegment.getProject() ); Callable cb = - createBuildCallable( rootSession, projectSegment, reactorContext, taskSegment, muxer ); + createBuildCallable( rootSession, projectSegment, reactorContext, taskSegment, muxer, + duplicateArtifactIds ); service.submit( cb ); } @@ -161,7 +173,8 @@ private void multiThreadedProjectTaskSegmentBuild( ConcurrencyDependencyGraph an ProjectSegment scheduledDependent = projectBuildList.get( mavenProject ); logger.debug( "Scheduling: " + scheduledDependent ); Callable cb = - createBuildCallable( rootSession, scheduledDependent, reactorContext, taskSegment, muxer ); + createBuildCallable( rootSession, scheduledDependent, reactorContext, taskSegment, muxer, + duplicateArtifactIds ); service.submit( cb ); } } @@ -183,19 +196,26 @@ private void multiThreadedProjectTaskSegmentBuild( ConcurrencyDependencyGraph an private Callable createBuildCallable( final MavenSession rootSession, final ProjectSegment projectBuild, final ReactorContext reactorContext, - final TaskSegment taskSegment, final ThreadOutputMuxer muxer ) + final TaskSegment taskSegment, + final ThreadOutputMuxer muxer, + final Set duplicateArtifactIds ) { return () -> { final Thread currentThread = Thread.currentThread(); final String originalThreadName = currentThread.getName(); - currentThread.setName( "mvn-builder-" + projectBuild.getProject().getId() ); + final MavenProject project = projectBuild.getProject(); + + final String threadNameSuffix = duplicateArtifactIds.contains( project.getArtifactId() ) + ? project.getGroupId() + ":" + project.getArtifactId() + : project.getArtifactId(); + currentThread.setName( "mvn-builder-" + threadNameSuffix ); try { // muxer.associateThreadWithProjectSegment( projectBuild ); - lifecycleModuleBuilder.buildProject( projectBuild.getSession(), rootSession, reactorContext, - projectBuild.getProject(), taskSegment ); + lifecycleModuleBuilder.buildProject( projectBuild.getSession(), rootSession, reactorContext, project, + taskSegment ); // muxer.setThisModuleComplete( projectBuild ); return projectBuild;