Day 8 of 40
IDE and Dispatcher Tools
Wiring up IntelliJ, content sync, and running Dispatcher locally
By the end of today you should be able to
- Set up an IDE for AEM development with a working content-sync workflow
- Explain the difference between syncing content and deploying a package
- Run the Dispatcher locally with the SDK's Docker-based tools
- Validate a Dispatcher configuration before it reaches a pipeline
Choosing an IDE
Adobe documents three: IntelliJ IDEA, Eclipse and Visual Studio Code. All three work. For a Java-heavy AEM project IntelliJ is the common professional choice; VS Code is popular when most of your day is HTL, CSS and JS.
Whichever you pick, you need three capabilities:
- Maven integration — build and deploy the project.
- Content sync — push a single file to a running instance without a full build.
- Remote debugging — attach to the local JVM (day 38).
For sync, the tooling is built on VLT (Jackrabbit FileVault): IntelliJ uses Repo or the AEM plugin, Eclipse uses the AEM Developer Tools, VS Code uses the AEM Sync-style extensions. They all do the same job — map a folder in your project to a path in the repository and push or pull individual files.
Two very different ways to get code onto an instance
- Content sync pushes a file straight into the JCR. Instant — good for iterating on HTL, dialogs and clientlibs. It does not rebuild your Java.
- Maven deploy (
mvn clean install -PautoInstallPackage) builds packages and installs them. Slower, but the only thing that recompiles your OSGi bundle.
The profiles you will actually type, from the project root:
# Build everything and install the 'all' package to author on 4502
mvn clean install -PautoInstallPackage
# Build and install only the core bundle (much faster for Java changes)
mvn clean install -PautoInstallBundle -pl core
# Target publish instead
mvn clean install -PautoInstallPackagePublish
Editing HTL? Sync it and refresh. Editing Java? You must rebuild the bundle. Confusing the two is the classic "why isn't my change showing up" of week one.
The local Dispatcher
The SDK's Dispatcher tools run the real Dispatcher module in Docker, using the same configuration your pipeline will deploy. Testing locally matters because Dispatcher problems — a filter that is too strict, a caching rule that never matches — are invisible until something sits in front of AEM.
# One-off: unpack the dispatcher tools from the SDK
./aem-sdk-dispatcher-tools-*.sh
# Validate the configuration (this is what the pipeline runs too)
bin/validate.sh dispatcher/src
# Start it, pointing at your local publish instance
bin/docker_run.sh dispatcher/src host.docker.internal:4503 8080
Your site is then at http://localhost:8080, going through the Dispatcher rather than
straight to AEM. The difference is immediately visible: pages get cached, and requests your filters
deny now actually fail.
bin/validate.sh runs the same checks as the Cloud Manager pipeline. Running it locally turns a failed deployment fifteen minutes into the future into an error message right now. There is also an update_maven.sh script that refreshes your project's baseline Dispatcher config files when Adobe updates them.
A workable local loop
- Author instance on 4502, publish on 4503.
- Dispatcher in Docker on 8080 in front of publish.
- Author content on 4502, publish it, check the real rendering through 8080.
- Java changes:
-PautoInstallBundle. Front-end changes: sync, or theui.frontendwatch task.
You do not need all of this every day. Most component work happens on author alone. But when you are chasing a caching bug or a filter problem, having publish and Dispatcher running locally is the difference between reasoning and guessing.
Sync for markup, Maven for Java, Docker for the Dispatcher. Validate Dispatcher config locally — the pipeline runs the identical check.
Watch
Adobe's own videos for this topic. They load only when you press play.
Read on Experience League
The primary sources these notes are drawn from.
Your notes
Saved automatically to this browser.
Check yourself
10 questions on today's material. 80% to pass.