Maven Build Cache Extension

August 13, 2026 · View on GitHub

Table of Contents

  1. Overview
  2. Feature Catalog (F1–F13, 79 features)
  3. Test Matrix (Group BASE + Groups A–Q)
  4. Required Test Coverage (master traceability table)
  5. Implementation Backlog
  6. Coverage Gaps & Recommendations
  7. Appendix: Property Reference

1. Overview

This document is the single reference for every Build Cache Extension feature and its integration test. It covers all 21 maven.build.cache.* system properties, all XML configuration options, and the correctness behaviors (cache key inputs, invalidation) verified by the test suite.

How to use this document

GoalWhere to look
Find the test that covers a specific feature§2 Feature Catalog → §4 TC# row
Plan which tests to implement next§5 Implementation Backlog
Look up a system property or its XML equivalent§7 Appendix: Property Reference

Reference project set

The last wave of integration tests run against projects in src/test/projects/reference-test-projects/. Each project covers exactly one Maven behavior dimension not covered by any other, so that a test failure points unambiguously to the feature being exercised.

19 reference configurations are defined in documentation/maven-test-projects-universe.md:

IDNameUnique dimension(s)
P01superpom-minimalSuper POM defaults; simplest single-module baseline
P02local-parent-inheritLocal reactor parent; full dependency/plugin inheritance
P03remote-parent<relativePath/> empty → parent resolved from repository
P04ci-friendly${revision} + flatten-maven-plugin; CI-friendly versions
P05bom-singleSingle BOM import; no explicit parent
P06dep-edge-casesMulti-BOM mediation; system/optional/classifier; enforcer
P07plugin-rebindingmaven-plugin packaging; lifecycle rebinding; plugin deps
P08profiles-allAll profile activation types; all property sources
P09repos-mirrorsPOM <repositories>; settings mirror; snapshot updatePolicy
P10reactor-partialNested reactor; -pl -am; chained external parent
P11reactor-parallel-T N concurrent execution; cache thread-safety
P12core-ext-forkedCore extension + maven-invoker-plugin forked child
P13toolchains-jdktoolchains.xml; external JDK selection
P14distrib-deploy<distributionManagement>; snapshot/release deploy
P15relocationConsuming a dependency that carries <relocation> metadata
P16snapshot-reactorReactor SNAPSHOT deps; SNAPSHOT external; snapshot policy
P17war-webappWAR lifecycle; src/main/webapp; profile-filtered resources
P18maven4-native<subprojects>; <packaging>bom</packaging>; Maven 4
P19cache-lifecycleskipValues reconciliation; lifecycle escalation config

Testing paradigm

Parametrized base: CacheBaseBehaviorParametrizedTest runs 7 core behaviors against all 17 eligible reference projects (P01–P12, P14–P17, P19), producing 119 test runs. This verifies that fundamental cache behavior is project-agnostic. P13 requires toolchain JDK installations; P18 requires a Maven 4 binary — both are conditionally skipped in the base suite.

Feature-specific: Tests tied to one Maven dimension target the most relevant reference project directly — for example, WAR packaging tests use P17, parallel-build tests use P11.

Two additional projects outside the reference set cover behavior not representable by any existing project: shade-plugin-project (TC-079) and assembly-plugin-project (TC-080).

Cache Key Input Reference

The cache key for a module is derived from a hash of all Maven project inputs listed below. A change to any of these inputs must produce a cache miss on the next build. This reference drives the correctness test cases in Group Q and CacheInvalidationProjectTraitsTest.

Source & File Inputs

InputHow fingerprintedReference project
src/main/java/** contentFile hash of every .java fileP01 (baseline)
src/test/java/** contentFile hash of every test .java fileP01 (baseline)
src/main/resources/** contentFile hash of every resource fileP01 (baseline)
src/main/webapp/** contentFile hash of webapp assets (WAR packaging)P17
System-scope JAR file (<systemPath>)Hash of the JAR bytes at the declared pathP01, P06

Project Descriptor (POM) Inputs

InputHow fingerprintedReference project
Effective POM content (semantics)Canonical effective-POM hash (whitespace-normalised)P01–P18
Inline dependency coordinates + versionsPart of effective POMP01, P07–P09
Parent-managed dependency versionsPropagated into child effective POMP02, P10
BOM-managed dependency versions (single BOM)Resolved version in effective POMP05
BOM-managed versions (multi-BOM mediation order)First-wins resolution in effective POMP06
Exclusion declarationsChange resolved transitive classpath (effective POM)P06
Optional flag on a dependencyChanges dep propagation visible in effective POMP06
Classifier qualifier on a dependencyChanges resolved artifact coordinateP06
Plugin version (inline or managed)Part of effective POM plugin configP01, P02
Plugin configuration parametersTracked params contribute to keyP07
Plugin phase rebinding (<phase>)Changes effective lifecycle mapP07
Plugin classpath <dependencies>Changes what's on compiler/plugin classpathP07

Inheritance Chain Inputs

InputHow fingerprintedReference project
Local parent POM (managed deps/plugins/props)Resolved into child effective POMP02
Remote parent POM version (empty <relativePath/>)Fetched parent merged into effective POMP03
External parent (chained <relativePath/> empty)Corp-parent config flows into all descendantsP10

Profile & Property Sources

InputHow fingerprintedReference project
POM <properties> valuesResolved into effective POMP01–P18
Profile-injected properties (when profile is active)Effective POM includes active-profile contributionsP08
Profile activation: property trigger (-Denv=ci)Different active profiles → different effective POMP08
Profile activation: file-existence triggerPresence/absence of trigger.properties → different effective POMP08
Profile activation: JDK rangeActive on matching JDK → different effective POMP08
Profile activation: OS familyActive on matching OS → different effective POMP08
activeByDefault resetResets when any other profile activatesP08
settings.xml profile propertiesContributes to effective POM via active settings profileP08, P09
CLI -D system propertiesOverride all property sources; change effective POMP04, P08
CI-friendly ${revision}, ${sha1}, ${changelist}Part of project version and POM propertiesP04
Environment variables ${env.*}Referenced in POM propertiesP08

Multi-Module Reactor Inputs

InputHow fingerprintedReference project
Upstream module output (inter-module dependency)Downstream receives new artifact → different input hashP02, P10, P11
Reactor SNAPSHOT module source changeSame as upstream module output; no remote resolutionP16
External SNAPSHOT dependency contentRemotely resolved artifact; updatePolicy=alwaysP16

Packaging & Lifecycle

InputHow fingerprintedReference project
<packaging>jar</packaging>Standard JAR lifecycle default bindingsP01
<packaging>war</packaging>WAR lifecycle bindings; webapp dir includedP17
<packaging>maven-plugin</packaging>Custom lifecycle; descriptor + JARP07
<packaging>pom</packaging> BOM aggregatorNo compiled sources; POM artifactP02, P05, P10

2. Feature Catalog

Test status legend

SymbolMeaning
Integration test exists and covers this behavior
⚠️Partially covered (related test but does not directly assert this)
No integration test — gap

F1 Core Enablement

IDFeatureXML / System PropertyStatusTest Reference
F1.1Build extension via POM <build><extensions>pom.xml <extensions>BuildExtensionTest
F1.2Core extension via .mvn/extensions.xml.mvn/extensions.xmlCoreExtensionTest
F1.3Global enable/disable (XML or CLI)<enabled> / -Dmaven.build.cache.enabledBuildExtensionTest, SkipBuildExtensionTest.cacheDisabledViaCommandLine
F1.4Config path override-Dmaven.build.cache.configPathconfig/CustomConfigPathTest
F1.5Defaults-only mode (no XML file present)implicitconfig/NoConfigFileDefaultsTest
F1.6Maven version guard (requires ≥ 3.9.0)CacheConfigImpl.initialize()
F1.7XML config validation<validateXml>
F1.8Malformed XML → descriptive startup errorimplicitconfig/InvalidConfigXmlTest

F2 Input Fingerprinting

IDFeatureXML / System PropertyStatusTest Reference
F2.1Global glob pattern<input><global><glob> / maven.build.cache.input.globIncludeExcludeTest
F2.2Global include paths<input><global><includes> / maven.build.cache.inputIncludeExcludeTest
F2.3Global exclude paths<input><global><excludes> / maven.build.cache.exclude.*IncludeExcludeTest
F2.4Source file added → cache missimplicitchecksumcorrectness/AddedSourceFileInvalidatesCacheTest
F2.5Source file deleted → cache missimplicitchecksumcorrectness/DeletedSourceFileInvalidatesCacheTest
F2.6Source file modified → cache missimplicitchecksumcorrectness/SourceChangeInvalidatesCacheTest
F2.7POM functional change → cache missimplicitchecksumcorrectness/PomChangeInvalidatesCacheTest
F2.8POM whitespace-only change → cache hitimplicitchecksumcorrectness/WhitespaceOnlyPomChangeNoCacheMissTest
F2.9Property change → cache miss<properties>checksumcorrectness/PropertyChangeInvalidatesCacheTest
F2.10Resource file change → cache misssrc/main/resourceschecksumcorrectness/ResourceChangeInvalidatesCacheTest
F2.11Test source change → cache misssrc/test/javachecksumcorrectness/TestSourceChangeInvalidatesCacheTest
F2.12Dependency version change → cache misseffective POMchecksumcorrectness/DependencyVersionChangeInvalidatesCacheTest
F2.13Per-plugin dirScan configuration<input><plugins><plugin><dirScan>
F2.14Per-execution dirScan override<input><plugins><plugin><executions>
F2.15Effective POM property exclusion per plugin<plugin><effectivePom><excludeProperties>inputfiltering/EffectivePomExcludePropertyTest
F2.16Plugin dependency exclusion from fingerprint<plugin><excludeDependencies>
F2.17processPlugins flagmaven.build.cache.processPluginsinputfiltering/ProcessPluginsDisabledTest
F2.18Project-level glob override (POM property)maven.build.cache.input.glob in <properties>inputfiltering/PerProjectGlobOverrideTest
F2.19Project-level additional include (POM property)maven.build.cache.input.* in <properties>inputfiltering/ProjectLevelIncludeTest
F2.20Project-level exclude (POM property)maven.build.cache.exclude.* in <properties>
F2.21Profile activation changes effective POM → cache miss-P profileinputfiltering/ProfileCliActivationInvalidatesTest
F2.22Hidden files excluded automaticallyimplicit

F3 Hash Algorithms

IDFeatureXML / System PropertyStatusTest Reference
F3.1Default algorithm: XX (XXHash64)<hashAlgorithm>XX(all existing ITs)
F3.2All non-MM algorithms round-trip (SHA-1, SHA-256, SHA-384, SHA-512, METRO, XX)<hashAlgorithm>SHA-1|SHA-256|…hashalgorithm/HashAlgorithmRoundTripTest (parametrized)
F3.3XXMM (memory-mapped, needs --add-opens)<hashAlgorithm>XXMM
F3.4METRO+MM (memory-mapped, needs --add-opens)<hashAlgorithm>METRO+MM
F3.5Invalid algorithm → startup failure<hashAlgorithm>BOGUShashalgorithm/InvalidHashAlgorithmTest
F3.6Algorithm change between builds → cache missconfig changehashalgorithm/HashAlgorithmChangeCacheMissTest

F4 Execution Control

IDFeatureXML / System PropertyStatusTest Reference
F4.1runAlways by plugin coordinates<executionControl><runAlways><plugins>pluginexecution/RunAlwaysPluginTest
F4.2runAlways by goal name<executionControl><runAlways><goalsLists>pluginexecution/RunAlwaysByGoalTest
F4.3runAlways by execution ID<executionControl><runAlways><executions>pluginexecution/RunAlwaysByExecutionIdTest
F4.4alwaysRunPlugins CLI property-Dmaven.build.cache.alwaysRunPluginspluginexecution/AlwaysRunPluginsCliTest
F4.5ignoreMissing — skip absent executions<executionControl><ignoreMissing>pluginexecution/IgnoreMissingPluginTest
F4.6Reconcile: skipValue allows cache hit<property skipValue="…">pluginexecution/TrackedPropertySkipValueAllowsReuseTest
F4.7Reconcile: mismatch → cache miss<reconcile>…<property>pluginexecution/TrackedPropertyMismatchCacheMissTest
F4.8Reconcile: match → cache hit<reconcile>…<property>pluginexecution/TrackedPropertyMatchCacheHitTest
F4.9Reconcile: defaultValue used when absent<property defaultValue="…">pluginexecution/TrackedPropertyDefaultValueTest
F4.10Reconcile: logAll flag on goal<reconcile><plugin logAll="true">pluginexecution/LogAllPropertiesTest
F4.11Reconcile: nolog suppresses property<property nolog="true">pluginexecution/TrackedPropertyNologTest
F4.12logAllProperties global flag<reconcile><logAllProperties>pluginexecution/LogAllPropertiesGlobalTest
F4.13Forked execution tracked correctlyimplicitForkedExecutionsTest, ForkedExecutionCoreExtensionTest
F4.14Duplicate goal executions within one buildimplicitDuplicateGoalsTest
F4.15Missing cached execution → full rebuildBuild.getMissingExecutions()pluginexecution/MissingExecutionTriggerRebuildTest

F5 Artifact Restore

IDFeatureXML / System PropertyStatusTest Reference
F5.1Standard artifact restore (JAR → local repo)implicitBuildExtensionTest.simple
F5.2Classified artifact restore (sources, javadoc)implicitIncrementalRestoreTest
F5.3lazyRestore — defer remote download-Dmaven.build.cache.lazyRestoreIncrementalRestoreTest
F5.4restoreGeneratedSources=false-Dmaven.build.cache.restoreGeneratedSourcesartifacts/RestoreGeneratedSourcesFalseTest
F5.5restoreOnDiskArtifacts=false-Dmaven.build.cache.restoreOnDiskArtifactsartifacts/RestoreOnDiskArtifactsFalseTest
F5.6Corrupted/truncated ZIP handled gracefullyimplicitfailurerecovery/CorruptedZipCacheEntryTest
F5.7NORMALIZED_VERSION → SNAPSHOT bump is cache hitcalculateProjectVersionChecksum=falseversioning/SnapshotVersionBumpCacheHitTest

F6 Output Management

IDFeatureXML / System PropertyStatusTest Reference
F6.1Primary artifact stored/restoredimplicitBuildExtensionTest.simple
F6.2attachedOutputs — additional directories<attachedOutputs><dirName glob="…">IncrementalRestoreTest (extra-resources/, other-resources/)
F6.3preservePermissions — POSIX permissions<attachedOutputs preservePermissions="…">output/PermissionsPreservationTest
F6.4Output exclude patterns (regex)<output><exclude><patterns>output/OutputExcludePatternTest
F6.5maxBuildsCached LRU eviction<local><maxBuildsCached>output/MaxLocalBuildsCachedTest
F6.6Custom local cache location-Dmaven.build.cache.locationBuildExtensionTest.skipSaving
F6.7Stale artifacts in target/ not leaked to cachestagePreExistingArtifacts internalinternal/StagingRemovesStaleClassesTest

F7 Remote Cache

IDFeatureXML / System PropertyStatusTest Reference
F7.1Remote cache read<remote><url> / -Dmaven.build.cache.remote.urlRemoteCacheDavTest
F7.2Remote cache enable/disable<remote enabled="…"> / -Dmaven.build.cache.remote.enabledRemoteCacheDavTest
F7.3Remote save (push)<remote><save><enabled> / -Dmaven.build.cache.remote.save.enabledRemoteCacheDavTest
F7.4save.final — prohibit overwrite-Dmaven.build.cache.remote.save.finalremote/SaveFinalRemoteTest
F7.5Server authentication via settings.xml<remote id="…"> / -Dmaven.build.cache.remote.server.idRemoteCacheDavTest
F7.6Remote unavailable → graceful local fallbackimplicitremote/RemoteUnavailableFallbackTest
F7.7failFast on remote restore failure-Dmaven.build.cache.failFastadmin/FailFastTest
F7.8baselineUrl diff report-Dmaven.build.cache.baselineUrlremote/BaselineDiffTest

F8 Multi-Module / Reactor

IDFeatureXML / System PropertyStatusTest Reference
F8.1Full reactor — each module independently cachedimplicitIssue21Test, UpstreamModuleChangeDownstreamMissTest
F8.2Partial reactor (-pl) — targeted modules cachedimplicit -plmultimodule/MultiModulePartialBuildTest
F8.3Partial reactor with upstream restore (-pl -am)implicit -pl -ammultimodule/MultiModulePartialWithAmTest
F8.4Parallel builds (-T) — no cross-thread corruptionimplicit -Tmultimodule/ParallelBuildTest
F8.5scanProfiles — include active profiles in cache key<multiModule><scanProfiles>multimodule/ScanProfilesTest
F8.6Per-module skipCache / skipSave / enabled override via POMmaven.build.cache.skipCache / .enabledPerModuleFlagsTest
F8.7Subtree build of leaf module — cache hit via rootDirectory anchorimplicit (.mvn/ traversal)multimodule/SubtreeBuildCacheHitTest#subtreeBuildHitsCacheAfterFullReactorBuild
F8.8Partial reactor with upstream dep — -am puts B in session.getProjects() so checksum matches; no discovery configimplicit -pl -ammultimodule/SubtreeBuildCacheHitTest#partialReactorWithAmHitsCacheWithoutDiscovery
F8.9Subtree build with upstream dep + <discovery><scanProfiles> — full re-scan from root activates profile, discovers B with matching effective model<multiModule><discovery><scanProfiles>multimodule/SubtreeBuildCacheHitTest#subtreeWithDiscoveryAndScanProfileHitsCacheAfterFullReactorBuild

F9 Lifecycle Phases

IDFeatureXML / System PropertyStatusTest Reference
F9.1compile phase cached and restoredimplicitlifecyclephases/CompilePhaseDefaultCachedTest
F9.2test-compile phase cachedimplicitlifecyclephases/TestCompilePhaseTest
F9.3package phase cachedimplicitlifecyclephases/CompileThenPackageEscalationTest
F9.4install phase cachedimplicitlifecyclephases/InstallPhaseTest
F9.5Phase escalation → prior phase restored, new phase runsimplicitCompileThenPackageEscalationTest, PackageThenInstallEscalationTest
F9.6clean-only run → cache bypassed entirelyimplicitSkipBuildExtensionTest.simple
F9.7clean verify → clean runs first, then cacheimplicitlifecyclephases/CleanVerifyTest
F9.8mandatoryClean blocks save without prior clean<mandatoryClean> / -Dmaven.build.cache.mandatoryCleanMandatoryCleanTest
F9.9verify phase (with integration tests) cachedimplicitBuildExtensionTest.simple
F9.10Single goal mapped to a phase cached (e.g. compiler:compile)-Dmaven.build.cache.cacheSingleGoalsinglegoal/CompileGoalCachedTest
F9.11Single-goal entry escalates to/from a phase build without errorimplicitsinglegoal/CompileGoalThenPackageEscalationTest, singlegoal/PackageThenCompileGoalTest
F9.12cacheSingleGoal=false → single goal bypasses cache-Dmaven.build.cache.cacheSingleGoalsinglegoal/SingleGoalDisabledTest
F9.13Forked lifecycle of a CLI goal restores from cache (never saves)-Dmaven.build.cache.restoreForkedExecutionssinglegoal/ForkedLifecycleRestoreTest, singlegoal/ForkedRestoreDisabledTest, singlegoal/RunGoalNotCachedTest

F10 Admin Controls

IDFeatureXML / System PropertyStatusTest Reference
F10.1skipCache — force rebuild, still writes-Dmaven.build.cache.skipCachePerModuleFlagsTest
F10.2skipSave — read-only cache usage-Dmaven.build.cache.skipSaveBuildExtensionTest.skipSaving
F10.3failFast — abort on restore failure-Dmaven.build.cache.failFastadmin/FailFastTest
F10.4mandatoryClean — require clean before save-Dmaven.build.cache.mandatoryCleanMandatoryCleanTest
F10.5Mid-build failure → no partial cache entryimplicitfailurerecovery/BuildFailsMidwayNoCacheTest
F10.6maxBuildsCached LRU eviction<local><maxBuildsCached>output/MaxLocalBuildsCachedTest

F11 Configuration Injection

IDFeatureMechanismStatusTest Reference
F11.1XML file at default path.mvn/maven-build-cache-config.xmlall standard ITs
F11.2XML file at custom path-Dmaven.build.cache.configPathconfig/CustomConfigPathTest
F11.3CLI -D system property overrides XML-D<property>BuildExtensionTest.skipSaving, SkipBuildExtensionTest
F11.4POM <properties> per-module override<properties>PerModuleFlagsTest
F11.5No XML file → built-in defaults activeimplicitconfig/NoConfigFileDefaultsTest
F11.6alwaysRunPlugins CLI comma-list-Dmaven.build.cache.alwaysRunPluginspluginexecution/AlwaysRunPluginsCliTest

F12 Project Versioning

IDFeatureXML / System PropertyStatusTest Reference
F12.1adjustMetaInf — normalize MANIFEST.MF<projectVersioning><adjustMetaInf>versioning/MetaInfVersionAdjustmentTest
F12.2calculateProjectVersionChecksum<projectVersioning><calculateProjectVersionChecksum>versioning/SnapshotVersionBumpWithChecksumFlagTest
F12.3NORMALIZED_VERSION: SNAPSHOT bump → cache hitimplicit (default)versioning/SnapshotVersionBumpCacheHitTest
F12.4CI-friendly ${revision} version stabilityflatten-maven-plugin patternversioning/CIFriendlyRevisionVersionTest

F13 Diagnostics

IDFeatureXML / System PropertyStatusTest Reference
F13.1Per-goal logAll flag<reconcile><plugin logAll="true">pluginexecution/LogAllPropertiesTest
F13.2logAllProperties global flag<reconcile><logAllProperties>pluginexecution/LogAllPropertiesGlobalTest
F13.3buildinfo.xml FileHash debug<debugs><debug>FileHash</debug>reports/BuildInfoXmlDebugTest
F13.4buildinfo.xml EffectivePom debug<debugs><debug>EffectivePom</debug>
F13.5build-cache-report.xml generated per buildimplicitreports/CacheReportGeneratedTest
F13.6buildsdiff.xml generated with baselineUrl-Dmaven.build.cache.baselineUrlremote/BaselineDiffTest
F13.7CacheSource field (LOCAL/REMOTE/BUILD) in buildinfoBuild.sourceinternal/CacheSourceTrackingTest

3. Test Matrix

Each row defines a distinct, independently executable integration test targeting one primary behavior. The matrix is orthogonal: every behavior appears in one primary row only.

The "Reference Project" column shows:

  • PARAM P01-P19 — parametrized test running against all eligible reference projects
  • P<n> — specific reference project from src/test/projects/reference-test-projects/
  • legacy: <name> — existing non-reference test project (pre-v3)
  • new: <name> — a new project not in the reference set (2 cases only)

Group BASE: Parametrized Cross-Project Base Tests

Test class: CacheBaseBehaviorParametrizedTest ✅ (implemented) Reference projects: P01–P12, P14–P17, P19 (17 projects) Conditional: P13 — skipped when toolchain JDK installations are not configured Maven 4 only: P18 — included when running against Maven 4

Each BASE scenario runs as a @ParameterizedTest(@MethodSource("allReferenceProjects")). For multi-module projects the test targets the first leaf module. This class provides 119 test runs (17 projects × 7 scenarios) validating that core cache behaviors are project-agnostic.

IDScenarioFeaturesStatus
BASE-01First build completes; identical second build is hitF1.1, F1.2, F5.1
BASE-02Source file modification → cache missF2.6
BASE-03POM property value change → cache missF2.9
BASE-04enabled=false CLI → build runs, cache bypassedF1.3
BASE-05skipCache=true → rebuild occurs; cache writtenF10.1
BASE-06skipSave=true → cache hit; no new writeF10.2
BASE-07Compile→Package phase escalation → rebuildF9.5

Group A: Core Checksum Correctness

IDScenarioFeaturesReference ProjectStatus
A-01Build extension: hit/miss cycleF1.1, F5.1, F6.1legacy: build-extensionBuildExtensionTest.simple
A-02Core extension: hit/miss cycleF1.2, F5.1PARAM P01-P19CoreExtensionTest + BASE-01
A-03Source file added → missF2.4legacy: checksum-correctnessAddedSourceFileInvalidatesCacheTest
A-04Source file deleted → missF2.5legacy: checksum-correctnessDeletedSourceFileInvalidatesCacheTest
A-05Source file modified → missF2.6PARAM P01-P19SourceChangeInvalidatesCacheTest + BASE-02
A-06POM functional change → missF2.7legacy: checksum-correctnessPomChangeInvalidatesCacheTest
A-07POM whitespace-only → hitF2.8legacy: checksum-correctnessWhitespaceOnlyPomChangeNoCacheMissTest
A-08Resource file change → missF2.10legacy: checksum-correctnessResourceChangeInvalidatesCacheTest
A-09Test source change → missF2.11legacy: checksum-correctnessTestSourceChangeInvalidatesCacheTest
A-10Property change → missF2.9PARAM P01-P19PropertyChangeInvalidatesCacheTest + BASE-03
A-11Dependency version change → missF2.12P01checksumcorrectness/DependencyVersionChangeInvalidatesCacheTest
A-12System-scope JAR content change → missF2.9P01CacheInvalidationProjectTraitsTest.systemScopeJarContentChangeInvalidates
A-13Parent property bump propagates to declared dep → missF2.12P02CacheInvalidationProjectTraitsTest.parentPropertyChangeInvalidates
A-14BOM-managed unused dep version change → no miss (cache hit)F2.12/BOMP06CacheInvalidationProjectTraitsTest.bomManagedUnusedDepVersionChangeDoesNotInvalidate

Group B: Input Filtering

IDScenarioFeaturesReference ProjectStatus
B-01Global include/exclude/globF2.1–F2.3legacy: include-excludeIncludeExcludeTest
B-02Project-level glob override via POM propertyF2.18P02inputfiltering/PerProjectGlobOverrideTest
B-03Project-level include via POM propertyF2.19P02inputfiltering/ProjectLevelIncludeTest
B-04processPlugins=false skips param introspectionF2.17P01inputfiltering/ProcessPluginsDisabledTest
B-05Per-plugin dirScan limits scanned pathsF2.13P19PerPluginDirScanTest
B-06Effective POM property exclusion per pluginF2.15P19inputfiltering/EffectivePomExcludePropertyTest
B-07Profile activation changes effective POM → missF2.21P08inputfiltering/ProfileCliActivationInvalidatesTest
B-08OS env-var profile activation changes effective POM → missF2.21P08inputfiltering/EnvVariableChangeInvalidatesTest

Group C: Lifecycle Phases & Escalation

IDScenarioFeaturesReference ProjectStatus
C-01Compile phase cachedF9.1legacy: lifecycle-phasesCompilePhaseDefaultCachedTest
C-02Test-compile phase cachedF9.2legacy: lifecycle-phasesTestCompilePhaseTest
C-03Compile→Package escalation → rebuildF9.3, F9.5PARAM P01-P19CompileThenPackageEscalationTest + BASE-07
C-04Package→Install escalation → rebuildF9.4, F9.5legacy: lifecycle-phasesPackageThenInstallEscalationTest
C-05Install phase: artifact in local repoF9.4legacy: lifecycle-phasesInstallPhaseTest
C-06Clean-only run → cache bypassedF9.6PARAM P01-P19SkipBuildExtensionTest.simple
C-07clean verify — clean then cached buildF9.7PARAM P01-P19lifecyclephases/CleanVerifyTest
C-08Single goal compiler:compile cachedF9.10legacy: lifecycle-phasessinglegoal/CompileGoalCachedTest
C-09Single-goal ↔ phase escalation (both directions)F9.11legacy: lifecycle-phasessinglegoal/CompileGoalThenPackageEscalationTest, singlegoal/PackageThenCompileGoalTest
C-10cacheSingleGoal=false → goal bypasses cacheF9.12legacy: lifecycle-phasessinglegoal/SingleGoalDisabledTest
C-11CLI goal fork restores compile (never saves)F9.13new: single-goal-forksinglegoal/ForkedLifecycleRestoreTest, singlegoal/ForkedRestoreDisabledTest, singlegoal/RunGoalNotCachedTest

Group D: Plugin Execution & Reconciliation

IDScenarioFeaturesReference ProjectStatus
D-01Tracked property match → hitF4.8P19TrackedPropertyMatchCacheHitTest
D-02Tracked property mismatch → missF4.7P19TrackedPropertyMismatchCacheMissTest
D-03skipValue enables cache hit with skip flagF4.6P19TrackedPropertySkipValueAllowsReuseTest
D-04logAll dumps all propertiesF4.10, F13.1P19LogAllPropertiesTest
D-05Forked lifecycle execution trackedF4.13P12ForkedExecutionsTest
D-06Duplicate goal executions handledF4.14P01DuplicateGoalsTest
D-07runAlways by plugin — plugin always runsF4.1P19pluginexecution/RunAlwaysPluginTest
D-08runAlways by goal nameF4.2P19pluginexecution/RunAlwaysByGoalTest
D-09runAlways by execution IDF4.3P19pluginexecution/RunAlwaysByExecutionIdTest
D-10alwaysRunPlugins CLI propertyF4.4, F11.6P01pluginexecution/AlwaysRunPluginsCliTest
D-11ignoreMissing — absent executions skippedF4.5P19pluginexecution/IgnoreMissingPluginTest
D-12Reconcile defaultValue for absent propertyF4.9P19pluginexecution/TrackedPropertyDefaultValueTest
D-13Missing cached execution → full rebuildF4.15P19pluginexecution/MissingExecutionTriggerRebuildTest

Group E: Artifact Restore

IDScenarioFeaturesReference ProjectStatus
E-01Incremental restore + extra outputs + classifiersF5.2, F5.3, F6.2legacy: mbuildcache-incrementalIncrementalRestoreTest
E-02restoreGeneratedSources=false skips sourcesF5.4P01artifacts/RestoreGeneratedSourcesFalseTest
E-03restoreOnDiskArtifacts=false skips target/F5.5P01artifacts/RestoreOnDiskArtifactsFalseTest
E-04Corrupted ZIP entry → clean rebuildF5.6legacy: failure-recoveryCorruptedZipCacheEntryTest

Group F: Output Management

IDScenarioFeaturesReference ProjectStatus
F-01Output exclude pattern filters from cache entryF6.4P17output/OutputExcludePatternTest
F-02preservePermissions=true restores POSIX bitsF6.3P01output/PermissionsPreservationTest
F-03maxBuildsCached evicts oldest entriesF6.5, F10.6P01output/MaxLocalBuildsCachedTest

Group G: Admin Controls

IDScenarioFeaturesReference ProjectStatus
G-01skipCache=true forces rebuild, still writesF10.1, F8.6PARAM P01-P19PerModuleFlagsTest + BASE-05
G-02skipSave=true reads from cache, no writeF10.2PARAM P01-P19BuildExtensionTest.skipSaving + BASE-06
G-03mandatoryClean=true blocks saveF9.8, F10.4PARAM P01-P19MandatoryCleanTest
G-04Mid-reactor failure → no partial entryF10.5P06BuildFailsMidwayNoCacheTest
G-05-Dmaven.build.cache.enabled=false via CLIF1.3, F11.3PARAM P01-P19SkipBuildExtensionTest.cacheDisabledViaCommandLine + BASE-04
G-06failFast=true aborts on restore failureF7.7, F10.3P01admin/FailFastTest

Group H: Configuration Injection

IDScenarioFeaturesReference ProjectStatus
H-01XML at default path configures all behaviorsF11.1PARAM P01-P19✅ all standard ITs
H-02CLI -D overrides XML settingF11.3legacy: build-extensionSkipBuildExtensionTest
H-03POM <properties> per-module overrideF11.4P10PerModuleFlagsTest
H-04configPath override to non-default locationF11.2, F1.4P01config/CustomConfigPathTest
H-05No XML file → built-in defaults activeF11.5, F1.5P01 (no-config)config/NoConfigFileDefaultsTest
H-06Malformed XML → descriptive startup errorF1.8P01config/InvalidConfigXmlTest

H-03 note: PerModuleFlagsTest currently uses the legacy per-module-flags project. The preferred v3 reference is P10 (nested reactor) which can host per-module property tests.

H-05 note: Test sets up P01 without a .mvn/maven-build-cache-config.xml file.

Group I: Multi-Module & Reactor

IDScenarioFeaturesReference ProjectStatus
I-01Full reactor: each module independently cachedF8.1legacy: build-extensionIssue21Test
I-02Per-module skipCache / skipSave /disabled via POMF8.6P10PerModuleFlagsTest
I-03Upstream module change → downstream missF8.1P02multimodule/UpstreamModuleChangeDownstreamMissTest
I-04Partial reactor -pl moduleF8.2P10multimodule/MultiModulePartialBuildTest
I-05Partial reactor -pl module -am upstream restoreF8.3P10multimodule/MultiModulePartialWithAmTest
I-06Parallel build -T2 cache correctnessF8.4P11multimodule/ParallelBuildTest
I-07scanProfiles includes active profile in cache keyF8.5P08multimodule/ScanProfilesTest
I-08Subtree build of leaf (no deps): Maven finds .mvn/ by traversal; cache key is identical from root or subdir because both anchor to the same rootDirectoryF8.7P02SubtreeBuildCacheHitTest#subtreeBuildHitsCacheAfterFullReactorBuild
I-09Partial reactor (-pl C -am), no <discovery>: -am includes B in session.getProjects(), so the extension computes C's multi-module checksum with B as a reactor sibling (not an external dep) → same key as full build → cache hitF8.8P02SubtreeBuildCacheHitTest#partialReactorWithAmHitsCacheWithoutDiscovery
I-10Subtree from C's dir, <discovery><scanProfiles>: only C in session.getProjects(); extension detects submodule context, re-scans from root pom activating full-reactor profile (via scanProfiles), discovers B with same effective model as full build → C's checksum matches → cache hitF8.9P02SubtreeBuildCacheHitTest#subtreeWithDiscoveryAndScanProfileHitsCacheAfterFullReactorBuild

Group J: Remote Cache

IDScenarioFeaturesReference ProjectStatus
J-01Remote cache read + write via WebDAVF7.1–F7.3, F7.5legacy: davRemoteCacheDavTest
J-02Remote unavailable → local fallbackF7.6P01 (WireMock)remote/RemoteUnavailableFallbackTest
J-03save.final=true — no overwriteF7.4P01 (WireMock)remote/SaveFinalRemoteTest
J-04Baseline URL diff reportF7.8, F13.6P01 (WireMock)remote/BaselineDiffTest

Group K: Hash Algorithms

IDScenarioFeaturesReference ProjectStatus
K-01SHA-256 algorithm correct hit/missF3.2P01hashalgorithm/HashAlgorithmRoundTripTest
K-02Invalid algorithm → startup failureF3.7P01hashalgorithm/InvalidHashAlgorithmTest

Group L: Project Versioning

IDScenarioFeaturesReference ProjectStatus
L-01SNAPSHOT version bump → cache hit (NORMALIZED_VERSION)F5.7, F12.3P16versioning/SnapshotVersionBumpCacheHitTest
L-02SNAPSHOT bump + calculateProjectVersionChecksum → missF12.2P16versioning/SnapshotVersionBumpWithChecksumFlagTest
L-03adjustMetaInf=true normalizes MANIFEST.MFF12.1P01versioning/MetaInfVersionAdjustmentTest
L-04CI-friendly ${revision} version: cache key stableF12.4P04versioning/CIFriendlyRevisionVersionTest
L-05External parent version bump (relativePath) → missF12, F2.12P10versioning/ExternalParentVersionBumpInvalidatesTest
L-06Remote parent version bump (local-repo) → missF12, F2.12P10versioning/RemoteParentVersionBumpInvalidatesTest

Group M: Portability & Cross-Environment

IDScenarioFeaturesReference ProjectStatus
M-01Absolute path stripped from effective POM → same key across machinesportabilityPARAM P01-P19portability/AbsolutePathNormalizationTest
M-02Tracked File property normalized to relativeportabilityP19portability/TrackedPropertyPathNormalizationTest

Group N: Project Type Variations

IDScenarioFeaturesReference ProjectStatus
N-01WAR packaging: web resources cached/restoredF6.1P17projecttypes/WarPackagingTest
N-02POM packaging: no source scan, key from effective POMF9, F2P02projecttypes/PomPackagingTest
N-03Test-jar classifier artifact cachedF5.2P06projecttypes/TestJarProjectTest
N-04Shade plugin: shaded JAR is the cached artifactF6.1new: shade-plugin-projectprojecttypes/ShadePluginArtifactReplacementTest
N-05Assembly plugin: exclusion pattern prevents ZIP in cacheF6.4new: assembly-plugin-projectprojecttypes/AssemblyPluginZipExcludeTest

Group O: Report Generation & Diagnostics

IDScenarioFeaturesReference ProjectStatus
O-01build-cache-report.xml present after buildF13.5P01reports/CacheReportGeneratedTest
O-02Report shows CACHED / REBUILT status per moduleF13.5P02reports/CacheReportStatusTest
O-03buildinfo.xml FileHash debug entriesF13.3P01reports/BuildInfoXmlDebugTest

Group P: Internal Architecture

IDScenarioFeaturesReference ProjectStatus
P-01Stale target/ artifacts not leaked into cacheF6.7P01internal/StagingRemovesStaleClassesTest
P-02Extra CLI goal after lifecycle goal (regression #399)implicitP01internal/AdditionalGoalAfterLifecycleTest
P-03Build round-trip serialization (unit test)XmlServiceinternal/BuildSerializationRoundTripTest

Group Q: Cache Invalidation — Project Traits

Tests verifying that each unique Maven input category correctly invalidates the cache. Primary test class: CacheInvalidationProjectTraitsTest.

IDScenarioFeaturesReference ProjectStatus
Q-01WAR webapp file change → WAR module misses; unchanged JAR module hitsF2.6, F8P17CacheInvalidationProjectTraitsTest.webappFileChangeInvalidates
Q-02Parent-managed dep version change → child modules missF2.12P02CacheInvalidationProjectTraitsTest.parentManagedDepVersionChangeInvalidates
Q-03Plugin version change in POM → cache missF2.7P01CacheInvalidationProjectTraitsTest.pluginVersionChangeInvalidates
Q-04BOM version change for a used dependency → cache missF2.12P05CacheInvalidationProjectTraitsTest.bomVersionChangeAffectedDepInvalidates
Q-05BOM import order change (first-wins) → resolved version changes → missF2.12P06CacheInvalidationProjectTraitsTest.bomImportOrderChangeInvalidates
Q-06Transitive exclusion removed → effective classpath changes → missF2.12P06CacheInvalidationProjectTraitsTest.exclusionRemovedInvalidatesCache
Q-07<optional>true</optional> flag removed → effective POM changes → missF2.12P06CacheInvalidationProjectTraitsTest.optionalFlagChangeInvalidates
Q-08Classifier dep removed → resolved artifact coordinates change → missF2.12P06CacheInvalidationProjectTraitsTest.classifierDepRemovedInvalidates
Q-09Plugin <phase> rebinding change → effective lifecycle map → missF2.7P07CacheInvalidationProjectTraitsTest.phaseRebindingChangeInvalidates
Q-10Plugin <dependencies> version change → plugin classpath → missF2.7P07CacheInvalidationProjectTraitsTest.pluginClasspathDepVersionChangeInvalidates
Q-11maven-plugin packaging cache round-tripF9P07CacheInvalidationProjectTraitsTest.mavenPluginPackagingCacheRoundTrip
Q-12Plugin goal prefix config change → plugin descriptor changed → missF2.7P07pluginexecution/PluginGoalPrefixChangeInvalidatesTest
Q-13Profile file-trigger activates → effective POM changes → missF2.21P08CacheInvalidationProjectTraitsTest.profileFileActivationInvalidates
Q-14settings.xml profile property change → dep version or param → missF2.9, F2.21P08inputfiltering/SettingsProfilePropertyChangeInvalidatesTest
Q-15activeByDefault profile resets when another activates → missF2.21P08inputfiltering/ActiveByDefaultResetInvalidatesTest
Q-16Unchanged module not evicted when leaf module changesF8.1P02CacheInvalidationProjectTraitsTest.unchangedModuleStaysInCache
Q-17Parallel build: one module change invalidates only dependentsF8.4P11CacheInvalidationProjectTraitsTest.parallelBuildModuleChangeInvalidates
Q-18Reactor SNAPSHOT source change propagates to all dependent modulesF8.1P16CacheInvalidationProjectTraitsTest.reactorSnapshotSourceChangeInvalidates
Q-19WAR profile-filtered resource change → WAR module missF2.21, NP17CacheInvalidationProjectTraitsTest.warProfileFilterChangeInvalidates
Q-20CI-driven version change without source change → cache hitF12.4P04versioning/CiBuildDrivenProjectVersionChangeCachedTest

4. Required Test Coverage

Master traceability table mapping behaviors to test classes and reference projects.

Status: ✅ exists | ⚠️ partial | ❌ missing Reference Project: P<n> = reference project · PARAM = parametrized across P01-P19 · legacy: <name> = existing non-reference project · new: <name> = new project needed

TC#Behavior / Test CaseTest ClassReference ProjectStatus
TC-001Build extension loads; first build saved, second restoredBuildExtensionTest.simplePARAM P01-P19
TC-002Core extension loads; same hit/miss cycleCoreExtensionTestPARAM P01-P19
TC-003maven.build.cache.enabled=false via CLI disables cacheSkipBuildExtensionTest.cacheDisabledViaCommandLinePARAM P01-P19
TC-004Adding a source file invalidates cacheAddedSourceFileInvalidatesCacheTestlegacy: checksum-correctness
TC-005Deleting a source file invalidates cacheDeletedSourceFileInvalidatesCacheTestlegacy: checksum-correctness
TC-006Modifying a source file invalidates cacheSourceChangeInvalidatesCacheTestPARAM P01-P19
TC-007Modifying POM (functional change) invalidates cachePomChangeInvalidatesCacheTestlegacy: checksum-correctness
TC-008Whitespace-only POM change is a cache hitWhitespaceOnlyPomChangeNoCacheMissTestlegacy: checksum-correctness
TC-009Resource file change invalidates cacheResourceChangeInvalidatesCacheTestlegacy: checksum-correctness
TC-010Test source change invalidates cacheTestSourceChangeInvalidatesCacheTestlegacy: checksum-correctness
TC-011POM <properties> value change invalidates cachePropertyChangeInvalidatesCacheTestPARAM P01-P19
TC-012Dependency version change in POM invalidates cacheDependencyVersionChangeInvalidatesCacheTestP01
TC-013compile phase cached and restoredCompilePhaseDefaultCachedTestlegacy: lifecycle-phases
TC-014test-compile phase cached and restoredTestCompilePhaseTestlegacy: lifecycle-phases
TC-015Phase escalation: compile→package forces rebuildCompileThenPackageEscalationTestPARAM P01-P19
TC-016Phase escalation: package→install forces rebuildPackageThenInstallEscalationTestlegacy: lifecycle-phases
TC-017Install phase: artifact available in local repo after restoreInstallPhaseTestlegacy: lifecycle-phases
TC-018Tracked property match → cache hitTrackedPropertyMatchCacheHitTestP19
TC-019Tracked property mismatch → cache missTrackedPropertyMismatchCacheMissTestP19
TC-020skipValue allows cache hit when skip property setTrackedPropertySkipValueAllowsReuseTestP19
TC-021Full reactor: modules cached independentlyIssue21TestP02, P10, P11
TC-022Mid-build failure: nothing written to cacheBuildFailsMidwayNoCacheTestP06
TC-023Global include paths restrict fingerprinted sourcesIncludeExcludeTestlegacy: include-exclude
TC-024Global exclude paths ignore matching filesIncludeExcludeTestlegacy: include-exclude
TC-025Global glob pattern selects source subsetIncludeExcludeTestlegacy: include-exclude
TC-026Incremental restore + extra output dirs + classifiersIncrementalRestoreTestlegacy: mbuildcache-incremental
TC-027Forked lifecycle execution tracked and cachedForkedExecutionsTestP12
TC-028Duplicate goal executions deduped correctlyDuplicateGoalsTestP01
TC-029logAll flag dumps all mojo propertiesLogAllPropertiesTestP19
TC-030Per-module skipCache / skipSave via POM propertyPerModuleFlagsTestP10
TC-031Per-module cache disabled via POM propertyPerModuleFlagsTestP10
TC-032skipCache=true global: rebuilds all, still writesSkipBuildExtensionTestPARAM P01-P19
TC-033skipSave=true: reads cache, does not writeBuildExtensionTest.skipSavingPARAM P01-P19
TC-034mandatoryClean=true: save blocked without cleanMandatoryCleanTestPARAM P01-P19
TC-035Corrupted ZIP cache entry: rebuild triggeredCorruptedZipCacheEntryTestPARAM P01-P19
TC-036Remote cache read and write (WebDAV)RemoteCacheDavTestlegacy: dav
TC-037clean-only run: cache bypassed, no lookupSkipBuildExtensionTest.simplePARAM P01-P19
TC-038Upstream reactor module change → downstream cache missUpstreamModuleChangeDownstreamMissTestP02
TC-039No .mvn/maven-build-cache-config.xml: defaults activeNoConfigFileDefaultsTestP01 (no-config)
TC-040configPath override: non-default XML loadedCustomConfigPathTestP01
TC-041Malformed XML config: descriptive error at startupInvalidConfigXmlTestP01
TC-042Profile activation changes effective POM → cache missProfileCliActivationInvalidatesTestP08
TC-043processPlugins=false: plugin params not introspectedProcessPluginsDisabledTestP01
TC-044Project-level glob override in POM <properties>PerProjectGlobOverrideTestP02
TC-045Project-level additional include via POM propertiesProjectLevelIncludeTestP02
TC-046Effective POM property exclusion for specific pluginEffectivePomExcludePropertyTestP19
TC-047runAlways by plugin coordinates: plugin always executesRunAlwaysPluginTestP19
TC-048runAlways by goal nameRunAlwaysByGoalTestP19
TC-049runAlways by execution IDRunAlwaysByExecutionIdTestP19
TC-050alwaysRunPlugins CLI: comma-list of plugin:goal pairsAlwaysRunPluginsCliTestP01
TC-051ignoreMissing: absent cached execution skippedIgnoreMissingPluginTestP19
TC-052Reconcile defaultValue used when property absentTrackedPropertyDefaultValueTestP19
TC-053Missing cached execution triggers full rebuildMissingExecutionTriggerRebuildTestP19
TC-054restoreGeneratedSources=false: generated sources not restoredRestoreGeneratedSourcesFalseTestP01
TC-055restoreOnDiskArtifacts=false: target/ artifacts not restoredRestoreOnDiskArtifactsFalseTestP01
TC-056Partial reactor -pl module-a: targeted module onlyMultiModulePartialBuildTestP10
TC-057Partial reactor -pl module-b -am: upstream restoredMultiModulePartialWithAmTestP10
TC-058WAR packaging: web resources cached and restoredWarPackagingTestP17
TC-059POM packaging: no source scan, effective POM is keyPomPackagingTestP02
TC-060CI-friendly ${revision} version: cache key stableCIFriendlyRevisionVersionTestP04
TC-061clean verify: clean runs before cache lookupCleanVerifyTestPARAM P01-P19
TC-062Output exclude regex pattern filters files from entryOutputExcludePatternTestP17
TC-063preservePermissions=true: POSIX bits restoredPermissionsPreservationTestP01 (Linux only)
TC-064maxBuildsCached=2: third build evicts oldest entryMaxLocalBuildsCachedTestP01
TC-065save.final=true: <final>true</final> embedded in pushed buildinfoSaveFinalRemoteTestP01 (WireMock)
TC-066Remote server unavailable: falls back to local cacheRemoteUnavailableFallbackTestP01 (unreachable URL)
TC-067failFast=true: build aborts on restore failureFailFastTestP01
TC-068Parallel build -T2: cache correctness maintainedParallelBuildTestP11
TC-069Per-plugin dirScan limits paths scannedPerPluginDirScanTestP19
TC-070Plugin dependency exclusion from fingerprintExcludeDependenciesPluginTestP07
TC-071SHA-256 algorithm: correct hit/miss behaviorHashAlgorithmRoundTripTestP01
TC-072Invalid hash algorithm: descriptive startup failureInvalidHashAlgorithmTestP01
TC-073SNAPSHOT version bump → cache hit (NORMALIZED_VERSION)SnapshotVersionBumpCacheHitTestP16
TC-074SNAPSHOT bump + calculateProjectVersionChecksum → missSnapshotVersionBumpWithChecksumFlagTestP16
TC-075adjustMetaInf=true: MANIFEST.MF version normalizedMetaInfVersionAdjustmentTestP01
TC-076Absolute path stripped → same cache key across workspacesAbsolutePathNormalizationTestPARAM P01-P19
TC-077Tracked File property normalized to relative pathTrackedPropertyPathNormalizationTestP19
TC-078Test-jar classifier artifact cached and restoredTestJarProjectTestP06
TC-079Shade plugin: shaded JAR (not empty original) is cachedShadePluginArtifactReplacementTestnew: shade-plugin-project
TC-080Assembly plugin: output exclusion prevents ZIP in cacheAssemblyPluginZipExcludeTestnew: assembly-plugin-project
TC-081Extra CLI goal after lifecycle goal (regression #399)AdditionalGoalAfterLifecycleTestP01
TC-082build-cache-report.xml generated after each buildCacheReportGeneratedTestP01
TC-083Report shows correct CACHED/REBUILT per moduleCacheReportStatusTestP02
TC-084Stale target/ files not included in new cache entryStagingRemovesStaleClassesTestP01
TC-085scanProfiles includes active profiles in reactor keyScanProfilesTestP08
TC-086logAllProperties global flag dumps all paramsLogAllPropertiesGlobalTestP19
TC-087buildinfo.xml debug: FileHash entries presentBuildInfoXmlDebugTestP01
TC-088CacheSource field: LOCAL after local hitCacheSourceTrackingTestP01
TC-089baselineUrl diff: buildsdiff.xml generatedBaselineDiffTestP01 + remote
TC-090Build object serializes and deserializes cleanlyBuildSerializationRoundTripTest
TC-091Exclusion FILENAME vs PATH rule types (unit)ExclusionRuleTypesTest
TC-092nolog suppresses property from reconcile outputTrackedPropertyNologTestP19
TC-093System-scope JAR content change (SNAPSHOT ver.) → cache missCacheInvalidationProjectTraitsTestP01
TC-094Parent <properties> bump propagates to declared dep → missCacheInvalidationProjectTraitsTestP02
TC-095BOM-managed unused dep version change → cache hit (no miss)CacheInvalidationProjectTraitsTestP06
TC-096OS env-var activates profile → effective POM changes → missEnvVariableChangeInvalidatesTestP08
TC-097External parent version bump (relativePath) → cache missExternalParentVersionBumpInvalidatesTestP10
TC-098Remote parent version bump (local-repo install) → cache missRemoteParentVersionBumpInvalidatesTestP10
TC-099WAR webapp file change → webapp-war misses; webapp-lib hitsCacheInvalidationProjectTraitsTestP17
TC-100Parent-managed dep version change → all child modules missCacheInvalidationProjectTraitsTestP02
TC-101Plugin version change in POM → cache missCacheInvalidationProjectTraitsTestP01
TC-102BOM version change for a used dep → resolved version changes → missCacheInvalidationProjectTraitsTestP05
TC-103BOM import order swap (first-wins) → different resolved version → missCacheInvalidationProjectTraitsTestP06
TC-104Transitive exclusion removed → effective classpath changes → missCacheInvalidationProjectTraitsTestP06
TC-105<optional>true</optional> removed → effective POM dep changes → missCacheInvalidationProjectTraitsTestP06
TC-106Classifier dep removed → resolved artifact coordinates change → missCacheInvalidationProjectTraitsTestP06
TC-107Plugin <phase> rebinding change → effective lifecycle map changes → missCacheInvalidationProjectTraitsTestP07
TC-108Plugin <dependencies> version change → plugin classpath → missCacheInvalidationProjectTraitsTestP07
TC-109Plugin goal prefix config change → plugin descriptor changed → misspluginexecution/PluginGoalPrefixChangeInvalidatesTestP07
TC-110Profile file-trigger activates → effective POM changes → missCacheInvalidationProjectTraitsTestP08
TC-111settings.xml profile property change → effective-POM dep/param → missinputfiltering/SettingsProfilePropertyChangeInvalidatesTestP08
TC-112activeByDefault profile resets when another profile activates → missinputfiltering/ActiveByDefaultResetInvalidatesTestP08
TC-113CI-driven version changes without source change → cache hitversioning/CiBuildDrivenProjectVersionChangeCachedTestP04
TC-114Unchanged module not evicted when only a leaf module changesCacheInvalidationProjectTraitsTestP02
TC-115Parallel build: one module change invalidates its dependents onlyCacheInvalidationProjectTraitsTestP11
TC-116Reactor SNAPSHOT source change propagates to all dependent modulesCacheInvalidationProjectTraitsTestP16
TC-117WAR profile-filtered resource change → WAR module missCacheInvalidationProjectTraitsTestP17
TC-118maven-plugin packaging: build+restore round-trip succeedsCacheInvalidationProjectTraitsTestP07
TC-119Subtree build of leaf module-api (no inter-module deps) from its own directory: Maven traverses up to .mvn/; cache key anchored to rootDirectory is identical to the full-reactor key → cache hitSubtreeBuildCacheHitTest#subtreeBuildHitsCacheAfterFullReactorBuildP02
TC-120Partial reactor -pl module-core -am (no discovery): -am puts module-api into session.getProjects(); extension computes module-core's checksum with module-api as a reactor sibling, matching the full-reactor key → cache hit for both B and CSubtreeBuildCacheHitTest#partialReactorWithAmHitsCacheWithoutDiscoveryP02
TC-121Subtree build from module-core's dir with <discovery><scanProfiles><scanProfile>full-reactor</scanProfile></scanProfiles>: only C in reactor; extension detects non-root context, re-scans from root pom activating the full-reactor profile (whose property is in every module's effective POM), discovers module-api with the same checksum as the full-reactor build → cache hit for CSubtreeBuildCacheHitTest#subtreeWithDiscoveryAndScanProfileHitsCacheAfterFullReactorBuildP02
TC-122Single goal compiler:compile cached and restored on second runsinglegoal/CompileGoalCachedTestlegacy: lifecycle-phases
TC-123compiler:compile then package: escalates without "Unsupported phase"singlegoal/CompileGoalThenPackageEscalationTestlegacy: lifecycle-phases
TC-124package then compiler:compile: compares cleanly without "Unsupported phase"singlegoal/PackageThenCompileGoalTestlegacy: lifecycle-phases
TC-125cacheSingleGoal=false: single goal bypasses cachesinglegoal/SingleGoalDisabledTestlegacy: lifecycle-phases
TC-126CLI goal's forked lifecycle (dependency:analyze → test-compile) restores compile from cachesinglegoal/ForkedLifecycleRestoreTestnew: single-goal-fork
TC-127restoreForkedExecutions=false: forked lifecycle recompiles (no restore)singlegoal/ForkedRestoreDisabledTestnew: single-goal-fork
TC-128Run-style goal with no default phase saves no cache entrysinglegoal/RunGoalNotCachedTestnew: single-goal-fork

Summary:

Total TCs✅ Existing❌ Missing
1281262

5. Implementation Backlog

Sprints 1–7 are complete. Two test classes remain unimplemented (see §6 for details):

TC#Test ClassReference ProjectNotes
TC-069PerPluginDirScanTestP19<dirScan> on maven-compiler-plugin to src/main/java; resource change → hit
TC-070ExcludeDependenciesPluginTestP07excludeDependencies=true on plugin; bump its dep version → cache still hits

Projects excluded from the BASE parametrized suite

ProjectReasonHow to enable
P13Requires JDK at specific toolchains.xml pathsConditional skip; run in CI with toolchains configured
P18Requires Maven 4 binaryRun in Maven 4 CI job only

6. Appendix: Property Reference

All maven.build.cache.* properties recognized by CacheConfigImpl. Resolution order: user properties (CLI -D) → system properties → default.

PropertyDefaultTypeXML equivalent
maven.build.cache.configPath(multimodule root)/.mvn/maven-build-cache-config.xmlpath
maven.build.cache.enabledtrueboolean<configuration><enabled>
maven.build.cache.location~/.m2/build-cachepath<configuration><local><location>
maven.build.cache.remote.enabledfalseboolean<configuration><remote enabled="…">
maven.build.cache.remote.urlURL<configuration><remote><url>
maven.build.cache.remote.server.idstring<configuration><remote id="…">
maven.build.cache.remote.save.enabledfalseboolean<configuration><remote><save><enabled>
maven.build.cache.remote.save.finalfalseboolean— (CLI only)
maven.build.cache.failFastfalseboolean— (CLI only)
maven.build.cache.baselineUrlURL— (CLI only)
maven.build.cache.lazyRestorefalseboolean— (CLI only)
maven.build.cache.restoreGeneratedSourcestrueboolean— (CLI / POM property)
maven.build.cache.restoreOnDiskArtifactstrueboolean— (CLI / POM property)
maven.build.cache.alwaysRunPluginscomma-list<executionControl><runAlways> (partial override)
maven.build.cache.skipCachefalseboolean— (CLI / POM property)
maven.build.cache.skipSavefalseboolean— (CLI / POM property)
maven.build.cache.mandatoryCleanfalseboolean<configuration><mandatoryClean>
maven.build.cache.processPluginstrueboolean— (POM property per-project)
maven.build.cache.input.globglob<input><global><glob> (per-project override)
maven.build.cache.input.*path<input><global><includes> (per-project)
maven.build.cache.exclude.*path/glob<input><global><excludes> (per-project)

Key XML-only elements

XML ElementDescription
<configuration><hashAlgorithm>XX (default), XXMM, METRO, METRO+MM, SHA-1, SHA-256, SHA-384, SHA-512
<configuration><attachedOutputs><dirName glob="…">Extra output dirs to capture/restore beyond primary artifact
<configuration><attachedOutputs preservePermissions="…">Restore POSIX permissions (default true)
<configuration><local><maxBuildsCached>LRU limit on local cache entries per project
<configuration><multiModule><scanProfiles>Profile names to include in multi-module reactor key
<configuration><projectVersioning><adjustMetaInf>Normalize Implementation-Version in MANIFEST.MF
<configuration><projectVersioning><calculateProjectVersionChecksum>Include project version in cache key
<input><global><glob>Global file glob for source selection
<input><global><includes>Additional always-included paths
<input><global><excludes>Always-excluded paths
<input><plugins><plugin><dirScan>Per-plugin directory scan override
<input><plugins><plugin><effectivePom><excludeProperties>POM properties excluded from plugin fingerprint
<input><plugins><plugin><excludeDependencies>Exclude plugin dependencies from fingerprint
<executionControl><runAlways><plugins>Plugins that always run regardless of cache hit
<executionControl><runAlways><goalsLists>Goals that always run
<executionControl><runAlways><executions>Execution IDs that always run
<executionControl><ignoreMissing><plugins>Executions to silently skip if absent in cached build
<executionControl><reconcile><plugins>Tracked plugin parameters for key reconciliation
<executionControl><reconcile><logAllProperties>Dump all plugin parameters globally
<output><exclude><patterns>Regex patterns for files excluded from cache bundle