From a36f758119fbed90f7073d3bc1bc4d091f5758d8 Mon Sep 17 00:00:00 2001 From: Romain Manni-Bucau Date: Tue, 15 Sep 2026 10:10:52 +0200 Subject: [PATCH 1/3] Fixes 13135, ensure completude of the reactor summary but priviledge failures to be last to stay human efficient --- .../maven/cli/event/ExecutionEventLogger.java | 72 +++++++++--- .../cli/event/ExecutionEventLoggerTest.java | 108 ++++++++++++++++-- .../cling/event/ExecutionEventLogger.java | 72 +++++++++--- .../cling/event/ExecutionEventLoggerTest.java | 108 ++++++++++++++++-- 4 files changed, 308 insertions(+), 52 deletions(-) diff --git a/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java b/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java index ead9d732fdfa..98911f76932d 100644 --- a/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java +++ b/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java @@ -20,6 +20,7 @@ import java.io.File; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -199,31 +200,51 @@ private void logReactorSummary(MavenSession session) { List projects = session.getProjects(); - StringBuilder buffer = new StringBuilder(128); - String skippedMessage = builder().warning("SKIPPED").build(); String successMessage = builder().success("SUCCESS").build(); String failureMessage = builder().failure("FAILURE").build(); String unknownMessage = builder().warning("UNKNOWN").build(); - boolean lastWasSkipped = false; + List entries = new ArrayList<>(projects.size()); for (MavenProject project : projects) { BuildSummary buildSummary = result.getBuildSummary(project); String statusMessage; - boolean shouldSkip = result.hasExceptions(); - if (buildSummary == null) { - statusMessage = skippedMessage; - } else if (buildSummary instanceof BuildSuccess) { + int group; + if (buildSummary instanceof BuildSuccess) { statusMessage = successMessage; + group = 1; } else if (buildSummary instanceof BuildFailure) { statusMessage = failureMessage; - shouldSkip = false; + group = 2; + } else if (buildSummary == null) { + statusMessage = skippedMessage; + group = 0; } else { statusMessage = unknownMessage; + group = 0; } + entries.add(new ReactorSummaryEntry(project, buildSummary, group, statusMessage)); + } + + ReactorSummaryRequest request = + new ReactorSummaryRequest(entries, new StringBuilder(128), isSingleVersion, result.hasExceptions()); - if (shouldSkip) { + logReactorSummaryGroup(request, 0); + logReactorSummaryGroup(request, 1); + logReactorSummaryGroup(request, 2); + } + + private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { + StringBuilder buffer = request.buffer(); + + boolean lastWasSkipped = false; + for (ReactorSummaryEntry entry : request.entries()) { + if (entry.group() != group) { + continue; + } + + if (group == 0 && entry.buildSummary() == null && request.hasExceptions()) { lastWasSkipped = true; continue; } @@ -232,11 +253,11 @@ private void logReactorSummary(MavenSession session) { lastWasSkipped = false; } - buffer.append(project.getName()); + buffer.append(entry.project().getName()); buffer.append(' '); - if (!isSingleVersion) { - buffer.append(project.getVersion()); + if (!request.isSingleVersion()) { + buffer.append(entry.project().getVersion()); buffer.append(' '); } @@ -247,12 +268,16 @@ private void logReactorSummary(MavenSession session) { buffer.append(' '); } - buffer.append(statusMessage); - if (buildSummary != null) { - formatBuildTime(buffer, buildSummary); + buffer.append(entry.statusMessage()); + if (entry.buildSummary() != null) { + formatBuildTime(buffer, entry.buildSummary()); } - logger.info(buffer.toString()); + if (entry.buildSummary() instanceof BuildFailure) { + logger.error(buffer.toString()); + } else { + logger.info(buffer.toString()); + } buffer.setLength(0); } @@ -261,6 +286,12 @@ private void logReactorSummary(MavenSession session) { } } + private record ReactorSummaryRequest( + List entries, StringBuilder buffer, boolean isSingleVersion, boolean hasExceptions) {} + + private record ReactorSummaryEntry( + MavenProject project, BuildSummary buildSummary, int group, String statusMessage) {} + private void formatBuildTime(StringBuilder buffer, BuildSummary buildSummary) { buffer.append(" ["); String buildTimeDuration = formatDuration(buildSummary.getTime()); @@ -276,12 +307,17 @@ private void logResult(MavenSession session) { infoLine('-'); MessageBuilder buffer = builder(); - if (session.getResult().hasExceptions()) { + boolean failure = session.getResult().hasExceptions(); + if (failure) { buffer.failure("BUILD FAILURE"); } else { buffer.success("BUILD SUCCESS"); } - logger.info(buffer.toString()); + if (failure) { + logger.error(buffer.toString()); + } else { + logger.info(buffer.toString()); + } } private MessageBuilder builder() { diff --git a/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java b/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java index 1f7bd60aa662..0fd46d25e32f 100644 --- a/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java +++ b/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java @@ -343,6 +343,97 @@ void testSessionEndedSuccessMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); } + @Test + void testSessionEndedSuccessWithSkippedModules() { + // prepare + MavenProject project1 = generateMavenProject("Maven Project artifact1"); + MavenProject project2 = generateMavenProject("Maven Project artifact2"); + MavenProject project3 = generateMavenProject("Maven Project artifact3"); + + MavenExecutionResult executionResult = new DefaultMavenExecutionResult(); + executionResult.addBuildSummary(new BuildSuccess(project1, 1000)); + executionResult.addBuildSummary(new BuildSuccess(project3, 3000)); + + MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest(); + + ProjectDependencyGraph projectDependencyGraph = mock(ProjectDependencyGraph.class); + when(projectDependencyGraph.getSortedProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + + MavenSession mavenSession = mock(MavenSession.class); + when(mavenSession.getResult()).thenReturn(executionResult); + when(mavenSession.getRequest()).thenReturn(executionRequest); + when(mavenSession.getProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + when(mavenSession.getTopLevelProject()).thenReturn(project1); + when(mavenSession.getProjectDependencyGraph()).thenReturn(projectDependencyGraph); + + ExecutionEvent event = mock(ExecutionEvent.class); + when(event.getSession()).thenReturn(mavenSession); + + // execute + executionEventLogger.sessionEnded(event); + + // verify + InOrder inOrder = inOrder(logger); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); + inOrder.verify(logger).info(""); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info("BUILD SUCCESS"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); + inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + } + + @Test + void testSessionEndedFailureMixedWithSkippedModules() { + // prepare + MavenProject project1 = generateMavenProject("Maven Project artifact1"); + MavenProject project2 = generateMavenProject("Maven Project artifact2"); + MavenProject project3 = generateMavenProject("Maven Project artifact3"); + + MavenExecutionResult executionResult = new DefaultMavenExecutionResult(); + executionResult.addBuildSummary(new BuildSuccess(project1, 1000)); + executionResult.addBuildSummary(new BuildSuccess(project3, 3000)); + executionResult.addException(new Exception("Failure")); + + MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest(); + + ProjectDependencyGraph projectDependencyGraph = mock(ProjectDependencyGraph.class); + when(projectDependencyGraph.getSortedProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + + MavenSession mavenSession = mock(MavenSession.class); + when(mavenSession.getResult()).thenReturn(executionResult); + when(mavenSession.getRequest()).thenReturn(executionRequest); + when(mavenSession.getProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + when(mavenSession.getTopLevelProject()).thenReturn(project1); + when(mavenSession.getProjectDependencyGraph()).thenReturn(projectDependencyGraph); + + ExecutionEvent event = mock(ExecutionEvent.class); + when(event.getSession()).thenReturn(mavenSession); + + // execute + executionEventLogger.sessionEnded(event); + + // verify + InOrder inOrder = inOrder(logger); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); + inOrder.verify(logger).info(""); + inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).error("BUILD FAILURE"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); + inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + } + @Test void testSessionEndedFailureMultimodule() { // prepare @@ -380,10 +471,10 @@ void testSessionEndedFailureMultimodule() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); - inOrder.verify(logger).info("BUILD FAILURE"); + inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); @@ -435,12 +526,13 @@ void testSessionEndedFailureMultimoduleWithSeparatedFailures() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); + inOrder.verify(logger).error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); - inOrder.verify(logger).info("BUILD FAILURE"); + inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java index b33cb1f6543e..e6f11d118882 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java @@ -25,6 +25,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -204,31 +205,51 @@ private void logReactorSummary(MavenSession session) { List projects = session.getProjects(); - StringBuilder buffer = new StringBuilder(128); - String skippedMessage = builder().warning("SKIPPED").build(); String successMessage = builder().success("SUCCESS").build(); String failureMessage = builder().failure("FAILURE").build(); String unknownMessage = builder().warning("UNKNOWN").build(); - boolean lastWasSkipped = false; + List entries = new ArrayList<>(projects.size()); for (MavenProject project : projects) { BuildSummary buildSummary = result.getBuildSummary(project); String statusMessage; - boolean shouldSkip = result.hasExceptions(); - if (buildSummary == null) { - statusMessage = skippedMessage; - } else if (buildSummary instanceof BuildSuccess) { + int group; + if (buildSummary instanceof BuildSuccess) { statusMessage = successMessage; + group = 1; } else if (buildSummary instanceof BuildFailure) { statusMessage = failureMessage; - shouldSkip = false; + group = 2; + } else if (buildSummary == null) { + statusMessage = skippedMessage; + group = 0; } else { statusMessage = unknownMessage; + group = 0; } + entries.add(new ReactorSummaryEntry(project, buildSummary, group, statusMessage)); + } + + ReactorSummaryRequest request = + new ReactorSummaryRequest(entries, new StringBuilder(128), isSingleVersion, result.hasExceptions()); - if (shouldSkip) { + logReactorSummaryGroup(request, 0); + logReactorSummaryGroup(request, 1); + logReactorSummaryGroup(request, 2); + } + + private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { + StringBuilder buffer = request.buffer(); + + boolean lastWasSkipped = false; + for (ReactorSummaryEntry entry : request.entries()) { + if (entry.group() != group) { + continue; + } + + if (group == 0 && entry.buildSummary() == null && request.hasExceptions()) { lastWasSkipped = true; continue; } @@ -237,11 +258,11 @@ private void logReactorSummary(MavenSession session) { lastWasSkipped = false; } - buffer.append(project.getName()); + buffer.append(entry.project().getName()); buffer.append(' '); - if (!isSingleVersion) { - buffer.append(project.getVersion()); + if (!request.isSingleVersion()) { + buffer.append(entry.project().getVersion()); buffer.append(' '); } @@ -252,12 +273,16 @@ private void logReactorSummary(MavenSession session) { buffer.append(' '); } - buffer.append(statusMessage); - if (buildSummary != null) { - formatBuildTime(buffer, buildSummary); + buffer.append(entry.statusMessage()); + if (entry.buildSummary() != null) { + formatBuildTime(buffer, entry.buildSummary()); } - logger.info(buffer.toString()); + if (entry.buildSummary() instanceof BuildFailure) { + logger.error(buffer.toString()); + } else { + logger.info(buffer.toString()); + } buffer.setLength(0); } @@ -266,6 +291,12 @@ private void logReactorSummary(MavenSession session) { } } + private record ReactorSummaryRequest( + List entries, StringBuilder buffer, boolean isSingleVersion, boolean hasExceptions) {} + + private record ReactorSummaryEntry( + MavenProject project, BuildSummary buildSummary, int group, String statusMessage) {} + private void formatBuildTime(StringBuilder buffer, BuildSummary buildSummary) { buffer.append(" ["); String buildTimeDuration = formatDuration(buildSummary.getExecTime()); @@ -281,12 +312,17 @@ private void logResult(MavenSession session) { infoLine('-'); MessageBuilder buffer = builder(); - if (session.getResult().hasExceptions()) { + boolean failure = session.getResult().hasExceptions(); + if (failure) { buffer.failure("BUILD FAILURE"); } else { buffer.success("BUILD SUCCESS"); } - logger.info(buffer.toString()); + if (failure) { + logger.error(buffer.toString()); + } else { + logger.info(buffer.toString()); + } } private MessageBuilder builder() { diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java index 4ef45d6b3556..e6de029c9989 100644 --- a/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java +++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java @@ -343,6 +343,97 @@ void testSessionEndedSuccessMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); } + @Test + void testSessionEndedSuccessWithSkippedModules() { + // prepare + MavenProject project1 = generateMavenProject("Maven Project artifact1"); + MavenProject project2 = generateMavenProject("Maven Project artifact2"); + MavenProject project3 = generateMavenProject("Maven Project artifact3"); + + MavenExecutionResult executionResult = new DefaultMavenExecutionResult(); + executionResult.addBuildSummary(new BuildSuccess(project1, 1000)); + executionResult.addBuildSummary(new BuildSuccess(project3, 3000)); + + MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest(); + + ProjectDependencyGraph projectDependencyGraph = mock(ProjectDependencyGraph.class); + when(projectDependencyGraph.getSortedProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + + MavenSession mavenSession = mock(MavenSession.class); + when(mavenSession.getResult()).thenReturn(executionResult); + when(mavenSession.getRequest()).thenReturn(executionRequest); + when(mavenSession.getProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + when(mavenSession.getTopLevelProject()).thenReturn(project1); + when(mavenSession.getProjectDependencyGraph()).thenReturn(projectDependencyGraph); + + ExecutionEvent event = mock(ExecutionEvent.class); + when(event.getSession()).thenReturn(mavenSession); + + // execute + executionEventLogger.sessionEnded(event); + + // verify + InOrder inOrder = inOrder(logger); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); + inOrder.verify(logger).info(""); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info("BUILD SUCCESS"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); + inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + } + + @Test + void testSessionEndedFailureMixedWithSkippedModules() { + // prepare + MavenProject project1 = generateMavenProject("Maven Project artifact1"); + MavenProject project2 = generateMavenProject("Maven Project artifact2"); + MavenProject project3 = generateMavenProject("Maven Project artifact3"); + + MavenExecutionResult executionResult = new DefaultMavenExecutionResult(); + executionResult.addBuildSummary(new BuildSuccess(project1, 1000)); + executionResult.addBuildSummary(new BuildSuccess(project3, 3000)); + executionResult.addException(new Exception("Failure")); + + MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest(); + + ProjectDependencyGraph projectDependencyGraph = mock(ProjectDependencyGraph.class); + when(projectDependencyGraph.getSortedProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + + MavenSession mavenSession = mock(MavenSession.class); + when(mavenSession.getResult()).thenReturn(executionResult); + when(mavenSession.getRequest()).thenReturn(executionRequest); + when(mavenSession.getProjects()).thenReturn(Arrays.asList(project1, project2, project3)); + when(mavenSession.getTopLevelProject()).thenReturn(project1); + when(mavenSession.getProjectDependencyGraph()).thenReturn(projectDependencyGraph); + + ExecutionEvent event = mock(ExecutionEvent.class); + when(event.getSession()).thenReturn(mavenSession); + + // execute + executionEventLogger.sessionEnded(event); + + // verify + InOrder inOrder = inOrder(logger); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); + inOrder.verify(logger).info(""); + inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).error("BUILD FAILURE"); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); + inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); + inOrder.verify(logger).info("------------------------------------------------------------------------"); + } + @Test void testSessionEndedFailureMultimodule() { // prepare @@ -380,10 +471,10 @@ void testSessionEndedFailureMultimodule() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); - inOrder.verify(logger).info("BUILD FAILURE"); + inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); @@ -435,12 +526,13 @@ void testSessionEndedFailureMultimoduleWithSeparatedFailures() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); + inOrder.verify(logger).error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); - inOrder.verify(logger).info("BUILD FAILURE"); + inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); From 3ef7ff90e8e401e2428ef1dc5c48c78785c8f718 Mon Sep 17 00:00:00 2001 From: Romain Manni-Bucau Date: Tue, 15 Sep 2026 16:26:42 +0200 Subject: [PATCH 2/3] Log reactor summary per-module detail on a nested .detail logger --- .../maven/cli/event/ExecutionEventLogger.java | 15 +++- .../cli/event/ExecutionEventLoggerTest.java | 73 +++++++++++++++---- .../cling/event/ExecutionEventLogger.java | 15 +++- .../cling/event/ExecutionEventLoggerTest.java | 73 +++++++++++++++---- ...nITmng7967ArtifactHandlerLanguageTest.java | 2 +- 5 files changed, 141 insertions(+), 37 deletions(-) diff --git a/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java b/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java index 98911f76932d..9c560959e140 100644 --- a/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java +++ b/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java @@ -58,6 +58,7 @@ public class ExecutionEventLogger extends AbstractExecutionListener { private final MessageBuilderFactory messageBuilderFactory; private final Logger logger; + private final Logger detailLogger; private int terminalWidth; private int lineLength; private int maxProjectNameLength; @@ -73,7 +74,17 @@ public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger } public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, int terminalWidth) { + this(messageBuilderFactory, logger, LoggerFactory.getLogger(logger.getName() + ".detail"), terminalWidth); + } + + public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger) { + this(messageBuilderFactory, logger, detailLogger, -1); + } + + public ExecutionEventLogger( + MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger, int terminalWidth) { this.logger = Objects.requireNonNull(logger, "logger cannot be null"); + this.detailLogger = Objects.requireNonNull(detailLogger, "detailLogger cannot be null"); this.messageBuilderFactory = messageBuilderFactory; this.terminalWidth = terminalWidth; } @@ -274,9 +285,9 @@ private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { } if (entry.buildSummary() instanceof BuildFailure) { - logger.error(buffer.toString()); + detailLogger.error(buffer.toString()); } else { - logger.info(buffer.toString()); + detailLogger.info(buffer.toString()); } buffer.setLength(0); } diff --git a/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java b/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java index 0fd46d25e32f..8eae8a76f790 100644 --- a/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java +++ b/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java @@ -60,6 +60,7 @@ class ExecutionEventLoggerTest { private MockitoSession mockitoSession; private Logger logger; + private Logger detailLogger; private ExecutionEventLogger executionEventLogger; private final JLineMessageBuilderFactory messageBuilderFactory = new JLineMessageBuilderFactory(); @@ -78,7 +79,9 @@ void beforeEach() { mockitoSession = Mockito.mockitoSession().startMocking(); logger = mock(Logger.class); when(logger.isInfoEnabled()).thenReturn(true); - executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger); + detailLogger = mock(Logger.class); + lenient().when(detailLogger.isInfoEnabled()).thenReturn(true); + executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger, detailLogger); } @AfterEach @@ -332,15 +335,23 @@ void testSessionEndedSuccessMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -377,15 +388,21 @@ void testSessionEndedSuccessWithSkippedModules() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder.verify(detailLogger).info("Maven Project artifact2 ............................ SKIPPED"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -424,14 +441,20 @@ void testSessionEndedFailureMixedWithSkippedModules() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -471,14 +494,20 @@ void testSessionEndedFailureMultimodule() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); } @Test @@ -526,17 +555,29 @@ void testSessionEndedFailureMultimoduleWithSeparatedFailures() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); - inOrder.verify(logger).info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); - inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - inOrder.verify(logger).error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); + detailInOrder + .verify(detailLogger) + .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); + detailInOrder + .verify(detailLogger) + .error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); } private static MavenProject generateMavenProject(String projectName) { diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java index e6f11d118882..9f2e515e00b5 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java @@ -63,6 +63,7 @@ public class ExecutionEventLogger extends AbstractExecutionListener { private final MessageBuilderFactory messageBuilderFactory; private final Logger logger; + private final Logger detailLogger; private int terminalWidth; private int lineLength; private int maxProjectNameLength; @@ -78,7 +79,17 @@ public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger } public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, int terminalWidth) { + this(messageBuilderFactory, logger, LoggerFactory.getLogger(logger.getName() + ".detail"), terminalWidth); + } + + public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger) { + this(messageBuilderFactory, logger, detailLogger, -1); + } + + public ExecutionEventLogger( + MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger, int terminalWidth) { this.logger = Objects.requireNonNull(logger, "logger cannot be null"); + this.detailLogger = Objects.requireNonNull(detailLogger, "detailLogger cannot be null"); this.messageBuilderFactory = messageBuilderFactory; this.terminalWidth = terminalWidth; } @@ -279,9 +290,9 @@ private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { } if (entry.buildSummary() instanceof BuildFailure) { - logger.error(buffer.toString()); + detailLogger.error(buffer.toString()); } else { - logger.info(buffer.toString()); + detailLogger.info(buffer.toString()); } buffer.setLength(0); } diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java index e6de029c9989..a4c0951555c6 100644 --- a/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java +++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java @@ -60,6 +60,7 @@ class ExecutionEventLoggerTest { private MockitoSession mockitoSession; private Logger logger; + private Logger detailLogger; private ExecutionEventLogger executionEventLogger; private final JLineMessageBuilderFactory messageBuilderFactory = new JLineMessageBuilderFactory(); @@ -78,7 +79,9 @@ void beforeEach() { mockitoSession = Mockito.mockitoSession().startMocking(); logger = mock(Logger.class); when(logger.isInfoEnabled()).thenReturn(true); - executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger); + detailLogger = mock(Logger.class); + lenient().when(detailLogger.isInfoEnabled()).thenReturn(true); + executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger, detailLogger); } @AfterEach @@ -332,15 +335,23 @@ void testSessionEndedSuccessMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -377,15 +388,21 @@ void testSessionEndedSuccessWithSkippedModules() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder.verify(detailLogger).info("Maven Project artifact2 ............................ SKIPPED"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -424,14 +441,20 @@ void testSessionEndedFailureMixedWithSkippedModules() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -471,14 +494,20 @@ void testSessionEndedFailureMultimodule() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); } @Test @@ -526,17 +555,29 @@ void testSessionEndedFailureMultimoduleWithSeparatedFailures() { inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); inOrder.verify(logger).info("..."); - inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); - inOrder.verify(logger).info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); - inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - inOrder.verify(logger).error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); + + InOrder detailInOrder = inOrder(detailLogger); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + detailInOrder + .verify(detailLogger) + .info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); + detailInOrder + .verify(detailLogger) + .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); + detailInOrder + .verify(detailLogger) + .error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); } @Test diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7967ArtifactHandlerLanguageTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7967ArtifactHandlerLanguageTest.java index fd59efa1d612..77f951438109 100644 --- a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7967ArtifactHandlerLanguageTest.java +++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7967ArtifactHandlerLanguageTest.java @@ -57,7 +57,7 @@ void javadocIsExecutedAndFailed() throws Exception { verifyTextNotInLog(logs, "[INFO] Not executing Javadoc as the project is not a Java classpath-capable package"); // javadoc invocation should actually fail the build - verifyTextInLog(logs, "[INFO] BUILD FAILURE"); + verifyTextInLog(logs, "[ERROR] BUILD FAILURE"); // javadoc invocation should actually fail the build verifyTextInLog(logs, "[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin"); From 75f5320cc94741d9516f8a5f8f6560761f9e7586 Mon Sep 17 00:00:00 2001 From: Romain Manni-Bucau Date: Tue, 15 Sep 2026 17:43:11 +0200 Subject: [PATCH 3/3] Always show reactor summary entries, drop extra .detail logger Keep SKIPPED modules visible regardless of build failure and rely on group ordering (skipped, success, failure) to bring failures last. Remove the separate .detail logger added earlier as it brought no benefit, and drop the now unused lastWasSkipped placeholder handling. --- .../maven/cli/event/ExecutionEventLogger.java | 34 +------- .../cli/event/ExecutionEventLoggerTest.java | 79 +++++-------------- .../cling/event/ExecutionEventLogger.java | 34 +------- .../cling/event/ExecutionEventLoggerTest.java | 79 +++++-------------- 4 files changed, 46 insertions(+), 180 deletions(-) diff --git a/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java b/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java index 9c560959e140..e8a87b21c909 100644 --- a/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java +++ b/compat/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java @@ -58,7 +58,6 @@ public class ExecutionEventLogger extends AbstractExecutionListener { private final MessageBuilderFactory messageBuilderFactory; private final Logger logger; - private final Logger detailLogger; private int terminalWidth; private int lineLength; private int maxProjectNameLength; @@ -74,17 +73,7 @@ public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger } public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, int terminalWidth) { - this(messageBuilderFactory, logger, LoggerFactory.getLogger(logger.getName() + ".detail"), terminalWidth); - } - - public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger) { - this(messageBuilderFactory, logger, detailLogger, -1); - } - - public ExecutionEventLogger( - MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger, int terminalWidth) { this.logger = Objects.requireNonNull(logger, "logger cannot be null"); - this.detailLogger = Objects.requireNonNull(detailLogger, "detailLogger cannot be null"); this.messageBuilderFactory = messageBuilderFactory; this.terminalWidth = terminalWidth; } @@ -238,8 +227,7 @@ private void logReactorSummary(MavenSession session) { entries.add(new ReactorSummaryEntry(project, buildSummary, group, statusMessage)); } - ReactorSummaryRequest request = - new ReactorSummaryRequest(entries, new StringBuilder(128), isSingleVersion, result.hasExceptions()); + ReactorSummaryRequest request = new ReactorSummaryRequest(entries, new StringBuilder(128), isSingleVersion); logReactorSummaryGroup(request, 0); logReactorSummaryGroup(request, 1); @@ -249,21 +237,11 @@ private void logReactorSummary(MavenSession session) { private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { StringBuilder buffer = request.buffer(); - boolean lastWasSkipped = false; for (ReactorSummaryEntry entry : request.entries()) { if (entry.group() != group) { continue; } - if (group == 0 && entry.buildSummary() == null && request.hasExceptions()) { - lastWasSkipped = true; - continue; - } - if (lastWasSkipped) { - logger.info("..."); - lastWasSkipped = false; - } - buffer.append(entry.project().getName()); buffer.append(' '); @@ -285,20 +263,16 @@ private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { } if (entry.buildSummary() instanceof BuildFailure) { - detailLogger.error(buffer.toString()); + logger.error(buffer.toString()); } else { - detailLogger.info(buffer.toString()); + logger.info(buffer.toString()); } buffer.setLength(0); } - - if (lastWasSkipped) { - logger.info("..."); - } } private record ReactorSummaryRequest( - List entries, StringBuilder buffer, boolean isSingleVersion, boolean hasExceptions) {} + List entries, StringBuilder buffer, boolean isSingleVersion) {} private record ReactorSummaryEntry( MavenProject project, BuildSummary buildSummary, int group, String statusMessage) {} diff --git a/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java b/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java index 8eae8a76f790..17a72222784d 100644 --- a/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java +++ b/compat/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java @@ -60,7 +60,6 @@ class ExecutionEventLoggerTest { private MockitoSession mockitoSession; private Logger logger; - private Logger detailLogger; private ExecutionEventLogger executionEventLogger; private final JLineMessageBuilderFactory messageBuilderFactory = new JLineMessageBuilderFactory(); @@ -79,9 +78,7 @@ void beforeEach() { mockitoSession = Mockito.mockitoSession().startMocking(); logger = mock(Logger.class); when(logger.isInfoEnabled()).thenReturn(true); - detailLogger = mock(Logger.class); - lenient().when(detailLogger.isInfoEnabled()).thenReturn(true); - executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger, detailLogger); + executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger); } @AfterEach @@ -335,23 +332,15 @@ void testSessionEndedSuccessMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -388,21 +377,15 @@ void testSessionEndedSuccessWithSkippedModules() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder.verify(detailLogger).info("Maven Project artifact2 ............................ SKIPPED"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -440,21 +423,15 @@ void testSessionEndedFailureMixedWithSkippedModules() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -493,21 +470,15 @@ void testSessionEndedFailureMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); } @Test @@ -554,30 +525,18 @@ void testSessionEndedFailureMultimoduleWithSeparatedFailures() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact6 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); + inOrder.verify(logger).error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); - detailInOrder - .verify(detailLogger) - .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - detailInOrder - .verify(detailLogger) - .error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); } private static MavenProject generateMavenProject(String projectName) { diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java index 9f2e515e00b5..bb8cefdfff34 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/event/ExecutionEventLogger.java @@ -63,7 +63,6 @@ public class ExecutionEventLogger extends AbstractExecutionListener { private final MessageBuilderFactory messageBuilderFactory; private final Logger logger; - private final Logger detailLogger; private int terminalWidth; private int lineLength; private int maxProjectNameLength; @@ -79,17 +78,7 @@ public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger } public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, int terminalWidth) { - this(messageBuilderFactory, logger, LoggerFactory.getLogger(logger.getName() + ".detail"), terminalWidth); - } - - public ExecutionEventLogger(MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger) { - this(messageBuilderFactory, logger, detailLogger, -1); - } - - public ExecutionEventLogger( - MessageBuilderFactory messageBuilderFactory, Logger logger, Logger detailLogger, int terminalWidth) { this.logger = Objects.requireNonNull(logger, "logger cannot be null"); - this.detailLogger = Objects.requireNonNull(detailLogger, "detailLogger cannot be null"); this.messageBuilderFactory = messageBuilderFactory; this.terminalWidth = terminalWidth; } @@ -243,8 +232,7 @@ private void logReactorSummary(MavenSession session) { entries.add(new ReactorSummaryEntry(project, buildSummary, group, statusMessage)); } - ReactorSummaryRequest request = - new ReactorSummaryRequest(entries, new StringBuilder(128), isSingleVersion, result.hasExceptions()); + ReactorSummaryRequest request = new ReactorSummaryRequest(entries, new StringBuilder(128), isSingleVersion); logReactorSummaryGroup(request, 0); logReactorSummaryGroup(request, 1); @@ -254,21 +242,11 @@ private void logReactorSummary(MavenSession session) { private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { StringBuilder buffer = request.buffer(); - boolean lastWasSkipped = false; for (ReactorSummaryEntry entry : request.entries()) { if (entry.group() != group) { continue; } - if (group == 0 && entry.buildSummary() == null && request.hasExceptions()) { - lastWasSkipped = true; - continue; - } - if (lastWasSkipped) { - logger.info("..."); - lastWasSkipped = false; - } - buffer.append(entry.project().getName()); buffer.append(' '); @@ -290,20 +268,16 @@ private void logReactorSummaryGroup(ReactorSummaryRequest request, int group) { } if (entry.buildSummary() instanceof BuildFailure) { - detailLogger.error(buffer.toString()); + logger.error(buffer.toString()); } else { - detailLogger.info(buffer.toString()); + logger.info(buffer.toString()); } buffer.setLength(0); } - - if (lastWasSkipped) { - logger.info("..."); - } } private record ReactorSummaryRequest( - List entries, StringBuilder buffer, boolean isSingleVersion, boolean hasExceptions) {} + List entries, StringBuilder buffer, boolean isSingleVersion) {} private record ReactorSummaryEntry( MavenProject project, BuildSummary buildSummary, int group, String statusMessage) {} diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java index a4c0951555c6..bf863990283c 100644 --- a/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java +++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/event/ExecutionEventLoggerTest.java @@ -60,7 +60,6 @@ class ExecutionEventLoggerTest { private MockitoSession mockitoSession; private Logger logger; - private Logger detailLogger; private ExecutionEventLogger executionEventLogger; private final JLineMessageBuilderFactory messageBuilderFactory = new JLineMessageBuilderFactory(); @@ -79,9 +78,7 @@ void beforeEach() { mockitoSession = Mockito.mockitoSession().startMocking(); logger = mock(Logger.class); when(logger.isInfoEnabled()).thenReturn(true); - detailLogger = mock(Logger.class); - lenient().when(detailLogger.isInfoEnabled()).thenReturn(true); - executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger, detailLogger); + executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger); } @AfterEach @@ -335,23 +332,15 @@ void testSessionEndedSuccessMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact2 ............................ SUCCESS [ 2.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -388,21 +377,15 @@ void testSessionEndedSuccessWithSkippedModules() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("BUILD SUCCESS"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder.verify(detailLogger).info("Maven Project artifact2 ............................ SKIPPED"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -440,21 +423,15 @@ void testSessionEndedFailureMixedWithSkippedModules() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact2 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); } @Test @@ -493,21 +470,15 @@ void testSessionEndedFailureMultimodule() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); } @Test @@ -554,30 +525,18 @@ void testSessionEndedFailureMultimoduleWithSeparatedFailures() { inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info("Reactor Summary for Maven Project artifact1 3.5.4-SNAPSHOT:"); inOrder.verify(logger).info(""); - inOrder.verify(logger).info("..."); + inOrder.verify(logger).info("Maven Project artifact6 ............................ SKIPPED"); + inOrder.verify(logger).info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); + inOrder.verify(logger).info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); + inOrder.verify(logger).info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); + inOrder.verify(logger).error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); + inOrder.verify(logger).error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).error("BUILD FAILURE"); inOrder.verify(logger).info("------------------------------------------------------------------------"); inOrder.verify(logger).info(eq("Total time: {}{}"), anyString(), anyString()); inOrder.verify(logger).info(eq("Finished at: {}"), anyString()); inOrder.verify(logger).info("------------------------------------------------------------------------"); - - InOrder detailInOrder = inOrder(detailLogger); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact1 ............................ SUCCESS [ 1.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact3 ............................ SUCCESS [ 3.000 s]"); - detailInOrder - .verify(detailLogger) - .info("Maven Project artifact4 ............................ SUCCESS [ 4.000 s]"); - detailInOrder - .verify(detailLogger) - .error("Maven Project artifact2 ............................ FAILURE [ 2.000 s]"); - detailInOrder - .verify(detailLogger) - .error("Maven Project artifact5 ............................ FAILURE [ 5.000 s]"); } @Test