Skip to content

Pipe structured BuilderProblems directly into DiagnosticCollector instead of re-logging as text #12643

Description

@gnodet

Context

PR #12572 (Build Report Foundation) introduced a warning collection pipeline that intercepts SLF4J WARN-level log calls via BuildReportCollector.captureLogEvent() and auto-creates BuilderProblem objects with synthetic keys (auto:xxx).

However, Maven already creates structured BuilderProblem objects during model/settings/toolchains validation (with key, suggestion, documentationUrl, source:line:column). These are currently re-logged as plain text by DefaultProjectsSelector and DefaultMaven.buildGraph(), losing all structured metadata.

Problem

When the SLF4J hook intercepts the re-logged text, it creates a new synthetic BuilderProblem with:

  • An auto-generated key (auto:logger-name:hash) instead of the original meaningful key
  • No suggestion
  • No documentationUrl
  • No source location

The original structured BuilderProblem data is discarded.

Proposed Solution

Phase 1: Model validation problems

In DefaultProjectsSelector and DefaultMaven.buildGraph(), after logging model problems at WARN level, pipe the original BuilderProblem directly into DefaultDiagnosticCollector:

// Current code:
LOGGER.warn(problem.getMessage());

// Proposed:
LOGGER.warn(problem.getMessage());
diagnosticCollector.report(problem); // preserves key, suggestion, docUrl, source location

The SLF4J hook should then skip auto-creating a synthetic problem when a structured one was already reported for the same message (dedup by message hash).

Phase 2: Settings and toolchains validation

In LookupInvoker (line 746) and MavenInvoker (line 218), same pattern — pipe settings/toolchains BuilderProblem objects directly instead of only logging their message text.

Phase 3: Plugin Validation Manager

DefaultPluginValidationManager operates a completely separate warning collection pipeline with its own ConcurrentHashMap<String, PluginValidationIssues>. The session-end summary is logged at WARN (captured by SLF4J hook), but the individual plugin validation issues (deprecated mojos, Maven 2 deps, etc.) with their plugin GAV, locality, and mojo info are lost.

Create structured BuilderProblem objects for each plugin validation issue and report them to the DiagnosticCollector, enriched with:

  • key: e.g. plugin-deprecated-mojo, plugin-maven2-dependency
  • source: plugin GAV (groupId:artifactId:version)
  • suggestion: e.g. "Update to Maven 4 API" or "Remove maven-compat dependency"
  • documentationUrl: link to Maven plugin development guide

Validators affected

Validator Current behavior After fix
DefaultModelValidator (~35 sites) BuilderProblem → re-logged as text → lost Structured piping
DefaultSettingsValidator (~15 sites) BuilderProblem → re-logged as text → lost Structured piping
DefaultToolchainsBuilder BuilderProblem → re-logged as text → lost Structured piping
DeprecatedPluginValidator Own collection → session-end summary text Structured BuilderProblem
Maven2DependenciesValidator Own collection → session-end summary text Structured BuilderProblem
Maven3CompatDependenciesValidator Own collection → session-end summary text Structured BuilderProblem
MavenScopeDependenciesValidator Own collection → session-end summary text Structured BuilderProblem
ReadOnlyPluginParametersValidator Own collection → session-end summary text Structured BuilderProblem
Profile activators (File, JDK) BuilderProblem → re-logged as text → lost Structured piping

Expected Outcome

mvnlog and mvnlog --diagnostics display the full structured information:

Problems: 2 warnings

  [WARN]  'prerequisites' is deprecated   pom.xml
          key: deprecated-prerequisites
          suggestion: Use the maven-enforcer-plugin instead
          docs: https://maven.apache.org/pom.html#prerequisites

  [WARN]  Plugin uses deprecated Maven 2 API   maven-shade-plugin:3.5.0
          key: plugin-maven2-dependency
          suggestion: Update to a version that uses Maven 4 API

Depends on

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions