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.
MIGRATION PATH
- Current platform
- Dependency assessment
- Code modernization
- Platform validation
- Content validation
- Delivery validation
- Release
THE PROBLEM
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.
WHAT I VALIDATE
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.
COMMON FAILURE AREAS
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.
RELEASE DECISIONS
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.
ENGINEERING NOTES
Follow the technical reasoning
- Why Is My OSGi Component Unsatisfied?
- Why Is This AEM Query Traversing the Repository?
- Testing Sling Models Beyond the Happy Path