Skip to content

Unnecessary static synchronization in ToolchainMojo causes contention in multi-module builds #174

Description

@elharo

Summary

ToolchainMojo uses a static LOCK object for synchronized around toolchainManagerPrivate.storeToolchainToBuildContext(). The storeToolchainToBuildContext method already operates on a per-session build context, making the static synchronization unnecessary and potentially causing contention in multi-module builds.

Location

ToolchainMojo.java:29, 67-69

https://github.com/apache/maven-toolchains-plugin/blob/master/src/main/java/org/apache/maven/plugins/toolchain/ToolchainMojo.java#L29
https://github.com/apache/maven-toolchains-plugin/blob/master/src/main/java/org/apache/maven/plugins/toolchain/ToolchainMojo.java#L67-L69

Code

private static final Object LOCK = new Object();

// ...

synchronized (LOCK) {
    toolchainManagerPrivate.storeToolchainToBuildContext(tc, session);
}

Problem

  1. The plugin is marked threadSafe = true, meaning Maven may execute it concurrently for different modules/sessions
  2. storeToolchainToBuildContext() stores data into the build context, which is already per-session and thread-safe
  3. The static lock introduces unnecessary contention: one module's toolchain selection blocks another unrelated module's selection
  4. This defeats the purpose of threadSafe = true

Impact

In multi-module Maven builds where the toolchains plugin runs in multiple modules (e.g., via inherited plugin configuration), the static lock serializes what could otherwise run in parallel, slowing down builds.

Suggested Fix

Remove the synchronized block entirely, as storeToolchainToBuildContext already handles its own concurrency per session.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions