Maven Cache Configuration Enhancement

This document describes the enhanced cache configuration functionality in Maven's DefaultRequestCache.

Overview

The DefaultRequestCache supports configurable reference types and cache scopes through user-defined selectors. This allows fine-grained control over caching behavior for different request types.

Key Features

1. Early Return for ProtoSession

  • The doCache method now returns early when the request session is not a Session instance (e.g., ProtoSession).
  • This prevents caching attempts for non-session contexts.

2. Configurable Cache Behavior

  • Cache scope and reference type can be configured via session user properties.
  • Configuration uses CSS-like selectors to match request types.
  • Supports parent-child request relationships.

Configuration Syntax

User Property

maven.cache.config

Selector Syntax

[ParentRequestType] RequestType { scope: <scope>, ref: <reference> }

Where:

  • RequestType: Short interface name implemented by the request (e.g., ModelBuilderRequest)
  • ParentRequestType: Optional parent request interface name or * for any parent
  • scope: Cache retention scope (optional)
  • ref: Reference type for cache entries (optional)

Note:

  • You can specify only scope or only ref - missing values will be merged from less specific selectors or use defaults.
  • Selectors match against all interfaces implemented by the request class, not just the class name.
  • This allows matching against ModelBuilderRequest interface even if the actual class is DefaultModelBuilderRequest.

Available Values

Scopes

  • session: SESSION_SCOPED - retained for Maven session duration
  • request: REQUEST_SCOPED - retained for current build request
  • persistent: PERSISTENT - persisted across Maven invocations
  • disabled: DISABLED - no caching performed

Reference Types

  • soft: SOFT - cleared before OutOfMemoryError
  • hard: HARD - never cleared by GC
  • weak: WEAK - cleared more aggressively
  • none: NONE - no caching (always compute)

Examples

Basic Configuration

mvn clean install -Dmaven.cache.config="ModelBuilderRequest { scope: session, ref: hard }"

Multiple Selectors with Merging

mvn clean install -Dmaven.cache.config="
ArtifactResolutionRequest { scope: session, ref: soft }
ModelBuildRequest { scope: request, ref: soft }
ModelBuilderRequest VersionRangeRequest { ref: hard }
ModelBuildRequest * { ref: hard }
"

Partial Configuration and Merging

# Base configuration for all ModelBuilderRequest
# More specific selectors can override individual properties
mvn clean install -Dmaven.cache.config="
ModelBuilderRequest { scope: session }
* ModelBuilderRequest { ref: hard }
ModelBuildRequest ModelBuilderRequest { ref: soft }
"

Parent-Child Relationships

# VersionRangeRequest with ModelBuilderRequest parent uses hard references
mvn clean install -Dmaven.cache.config="ModelBuilderRequest VersionRangeRequest { ref: hard }"

# Any request with ModelBuildRequest parent uses hard references
mvn clean install -Dmaven.cache.config="ModelBuildRequest * { ref: hard }"

Selector Priority and Merging

Selectors are ordered by specificity (most specific first):

  1. Parent + Request type (e.g., ModelBuildRequest ModelBuilderRequest)
  2. Request type only (e.g., ModelBuilderRequest)
  3. Wildcard patterns (e.g., * ModelBuilderRequest)

Configuration Merging

  • Multiple selectors can match the same request
  • More specific selectors override properties from less specific ones
  • Only non-null properties are merged (allows partial configuration)
  • Processing stops when a complete configuration is found

Example:

ModelBuilderRequest { scope: session }        # Base: sets scope
* ModelBuilderRequest { ref: hard }           # Adds ref type
ModelBuildRequest ModelBuilderRequest { ref: soft }  # Overrides ref for specific parent

For a ModelBuilderRequest with ModelBuildRequest parent:

  • Final config: scope: session, ref: soft

Implementation Details

Performance Considerations

  • Configuration parsing is cached per session to avoid re-parsing
  • Selector matching is optimized for common cases
  • Memory usage improved with configurable reference types
  • Early return for ProtoSession reduces overhead

Future Enhancements

Potential future improvements:

  • Support for more complex selector patterns
  • Configuration validation and error reporting
  • Runtime configuration updates
  • Performance metrics and monitoring