EXPERTISE / 01

AEM Migration & Modernization

An AEM upgrade changes more than the application binary. I approach migration as a platform compatibility exercise: establish what the current estate depends on, isolate the changes required by the target, and make release decisions from evidence.

Scope: on-premise AEM upgrade planning and modernization. The linked Work pages are representative scenarios; they are not client delivery records.

  • AEM 6.4
  • AEM 6.5
  • OSGi
  • Maven
  • Dispatcher
  • Oak

MIGRATION PATH

  1. Current platform
  2. Dependency assessment
  3. Code modernization
  4. Platform validation
  5. Content validation
  6. Delivery validation
  7. Release

Why a version bump is not a migration plan

Custom components, service users, repository queries and delivery rules form a network of assumptions. A clean Maven build proves only part of that network. Authoring dialogs may fail while published pages appear healthy; a warm cache can conceal an expensive request path.

The first decision is the migration boundary. A 6.4 to 6.5 upgrade, a subsequent 6.5 LTS modernization and preparation for AEM as a Cloud Service have different acceptance criteria. Combining them with a content-model redesign increases the number of possible causes when a regression appears.

Make compatibility observable at each layer

I start with an inventory and a repeatable baseline, then attach a validation check and an owner to each dependency. Representative content must include awkward cases, not only a small set of pristine pages.

  • Application: deprecated API usage, custom components, overlays, dialogs and legacy SCR annotation processing; plan migration to OSGi Declarative Services where appropriate.
  • Runtime: Java compatibility, bundle imports, OSGi references, configuration PIDs and service-user permissions.
  • Build: Maven dependency alignment, target API dependencies, package filters and reproducible artifacts.
  • Repository: supported repository upgrade path, Oak index definitions, query plans and content integrity.
  • Delivery: Dispatcher filters, rewrites, cache keys, invalidation and external API behavior.
  • Release: author/publish regression coverage, deployment order, backup/restore rehearsal and production acceptance criteria.

Diagnose the first broken contract

An unresolved bundle and an unsatisfied OSGi component require different investigations: package wiring in the first case, references and configuration in the second. Avoid treating either as a reason to restart the whole platform repeatedly.

For Oak, compare query plans with the same predicates and representative data. For Dispatcher, test both a cache miss and an update followed by invalidation. For custom components, validate the authoring interaction as well as rendered HTML and exported JSON.

  • An API replacement compiles but changes null handling or serialization.
  • A package silently overwrites environment configuration or content it does not own.
  • A successful rollback of application code leaves incompatible content changes behind.

Separate upgrade work from optional redesign

The migration path below is an assessment sequence, not a promise that every source release can be upgraded directly to every target. Confirm the supported route for the exact installation before rehearsing it.

Useful outputs are a dependency register, a prioritized remediation plan, a regression matrix and a release runbook with explicit stop conditions. Reducing environment-specific assumptions also helps future cloud readiness, but it does not certify an application for AEMaaCS.