apache/maven · warning

*

Error message

 * {}

What it means

Not an exception but the per-plugin heading line of Maven's end-of-session plugin validation report. DefaultPluginValidationManager is an EventSpy that collects validation issues during the build; at SessionEnded, when 'maven.plugin.validation' is set to summary, brief or verbose, it prints this line naming each affected plugin as ' * groupId:artifactId:version' (sorted case-insensitively). The issues underneath come from checks like MavenPluginValidator (malformed plugin descriptors) and PluginDependencyAnalyzer (wrong dependency scopes, leaked classloader dependencies).

Solutions

  1. Note the exact GAV on this line, read the indented issue lines below it, and act on them - in most cases upgrading the named plugin to its latest release clears the issue
  2. Pin that upgrade centrally in the top-level parent's <pluginManagement> so all modules inherit the fixed version
  3. If the plugin is maintained in-house, fix the reported problem (dependency scopes, removed-internal-API usage, descriptor fields) and release
  4. Suppress a known-acceptable plugin with -Dmaven.plugin.validation.excludes=groupId:artifactId:version, or mute the whole report with -Dmaven.plugin.validation=none (avoid in CI)

Example fix

// before (parent pom.xml, stale plugin inherited everywhere)
<build>
  <plugins>
    <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version></plugin>
  </plugins>
</build>
// after
<build>
  <pluginManagement>
    <plugins>
      <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version></plugin>
    </plugins>
  </pluginManagement>
</build>
Defensive patterns

Strategy: validation

Validate before calling

# preflight: list plugins with available updates before the build
mvn -q versions:display-plugin-updates -DallowSnapshots=false

Prevention

When it happens

Trigger: Run a build with -Dmaven.plugin.validation=summary|brief|verbose (or that value in settings.xml) in which at least one executed or resolved plugin raised a validation issue, e.g. a mojo using a deprecated API or a plugin depending on maven-core in compile scope. At SessionEnded, hasAnythingToReport() is true and one ' * GAV' line is printed per affected plugin.

Common situations: Maven 3.9+/4.x upgrades where the validation reporting shipped with MNG-7238-style checks suddenly surfaces in CI logs; multi-module builds inheriting stale plugin versions from a corporate parent; third-party plugins that lag behind current Maven API rules.

Related errors


AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21). Data as JSON: /api/errors/725dec2e710210ca. Report an issue: GitHub.

Appendix: source

Thrown at impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginValidationManager.java:232

                        || validationReportLevel == ValidationReportLevel.VERBOSE
                ? EnumSet.allOf(IssueLocality.class)
                : EnumSet.of(IssueLocality.EXTERNAL);

        if (hasAnythingToReport(issuesMap, issueLocalitiesToReport)) {
            logger.warn("");
            logger.warn("Plugin {} validation issues were detected in following plugin(s)", issueLocalitiesToReport);
            logger.warn("");

            // Sorting the plugins
            List<Map.Entry<String, PluginValidationIssues>> sortedEntries = new ArrayList<>(issuesMap.entrySet());
            sortedEntries.sort(Map.Entry.comparingByKey(String.CASE_INSENSITIVE_ORDER));

            for (Map.Entry<String, PluginValidationIssues> entry : sortedEntries) {
                PluginValidationIssues issues = entry.getValue();
                if (!hasAnythingToReport(issues, issueLocalitiesToReport)) {
                    continue;
                }
                logger.warn(" * {}", entry.getKey());
                if (validationReportLevel == ValidationReportLevel.VERBOSE) {
                    if (!issues.pluginDeclarations.isEmpty()) {
                        logger.warn("  Declared at location(s):");
                        for (String pluginDeclaration : issues.pluginDeclarations) {
                            logger.warn("   * {}", pluginDeclaration);
                        }
                    }
                    if (!issues.pluginIssues.isEmpty()) {
                        for (IssueLocality issueLocality : issueLocalitiesToReport) {
                            Set<String> pluginIssues = issues.pluginIssues.get(issueLocality);
                            if (pluginIssues != null && !pluginIssues.isEmpty()) {
                                logger.warn("  Plugin {} issue(s):", issueLocality);
                                for (String pluginIssue : pluginIssues) {
                                    logger.warn("   * {}", pluginIssue);
                                }
                            }
                        }
                    }

View on GitHub (pinned to e4093d4e12)