LTS Releases
All the long-term support releases, with their respective bug fixes and enhancements, are noted here.
Release 4.13.5
Bug fixes
-
Fixed a deserialization error for subscription query updates carrying a
voidresult. Axon Server connector clients on Axon Framework 5.3.2+ set an empty (0-byte) payload instead of omitting it entirely for void updates, which Axon Framework 4 failed to deserialize. Empty payloads are now treated the same as an absent payload, with the same safeguard added toGrpcBackedResponseMessage. -
Fixed Axon Framework 4 failing to deserialize
voidcommand results returned by an Axon Framework 5 application, caused by the same empty-payload behavior described above.
Release 4.13.4
Features
-
Moved the Bill-of-Materials module into the LTS repository itself, aligning its version with the other LTS modules so it can no longer drift from them as a separately maintained artifact.
Enhancements
-
Switched release artifact publishing to a dedicated service account.
-
Subscription query initial results now follow the same
ConvertingResponseMessageconversion flow used for direct queries, so singular and plural (for example, array or list) results are both handled consistently. -
MetadataSpanAttributesProviderno longer throws aNullPointerExceptiononnullmetadata values; it now resolves values withString#valueOfinstead of callingtoString()on them directly.
Bug fixes
-
Errors escaping a Unit of Work,
WorkPackage, orCoordinatorcommit/abort path (for example, aNoSuchMethodErrorfrom a dependency version mismatch) are now caught instead of silently killing the component without rolling back.UnitOfWork#attachTransactionwas also hardened so a transaction is concluded exactly once, with a cleanup safety net in case commit or rollback never fire. -
Command and query results of type
java.lang.Stringreturned by an Axon Framework 5 application are now deserialized correctly. Axon Server sends such results as raw UTF-8 bytes rather than JSON-quoted strings, which previously made Axon Framework 4 fail to parse them; a newGrpcRawStringAwareSerializerfalls back to a raw UTF-8 decode only when the regular serializer cannot parse the payload. -
Queries dispatched by an Axon Framework 5 application, which no longer sets the
response_typefield, can now find a matching query handler on Axon Framework 4. The missing field previously made the response type resolve to anUnknownSerializedType, preventing any handler match; it is now mapped to the sameIgnoredResponseTypealready used for subscription query updates. -
@ReplayContexthandlers no longer receive a replay context for live events delivered while aReplayTokenwrapper is still present but the processor is no longer replaying.ReplayToken#replayContextand#getTokenAtResetare now gated on the actual replay status, and an inverted type check that caused@ReplayContextparameters declared as a supertype to resolve tonullwas fixed.
Release 4.13.3
The first release cut from the dedicated Axon Framework 4 LTS repository. Functionally, this is a maintenance release: no new features, and no changes to the messaging, modelling, or event sourcing APIs. The bulk of the work is a full dependency refresh and the removal of two modules that no longer have a place in the LTS line.
Removed modules
-
axon-legacyhas been removed. It contained compatibility shims for reading data serialized by Axon 2 and Axon 3 (amongst others,AggregateScopeDescriptor,SagaScopeDescriptor,GapAwareTrackingToken,GlobalSequenceTrackingToken,MongoTrackingToken, the legacyGenericMessage/GenericEventMessage/MetaDataclasses, andLegacyAwareJobDataBinder). Anyone on the 4.x LTS line is long past an Axon 2 or 3 migration, so the module, along with itsjoda-timeandaxon-mongodependencies, has been dropped. If you still hold Axon 2/3-serialized tracking tokens, scope descriptors, or Quartz triggers in a datastore, convert them before upgrading. -
axon-migrationhas been removed. It shipped the OpenRewrite recipes (axon-javax-4,axon-jakarta-4) for migrating projects to Axon Framework 4.7, and pinned OpenRewrite and Jackson to old versions to do so.
Behavioural and compatibility notes
-
LMAX Disruptor was upgraded from 3.4.4 to 4.0.0 in
axon-disruptor. This has two consequences:CommandHandlerInvokerno longer implementscom.lmax.disruptor.LifecycleAware(removed in Disruptor 4, a source- and binary-incompatible change for anyone referencing that type), and Disruptor 4 no longer accepts anExecutor, only aThreadFactory.DisruptorCommandBusnow passes an internalAxonThreadFactoryto the ring buffer; anExecutorsupplied throughDisruptorCommandBus.Builder#executorstill drives the publisher threads, but no longer the ring buffer’s own event-processor threads. -
axon-testnow pulls in JUnit Jupiter 6.1.2 (compile scope, transitive). If you do not manage the JUnit version yourself, your test classpath moves from Jupiter 5.13.4 to 6.1.2. Importjunit-bomor pinorg.junit.jupiter:junit-jupiterto stay on 5.x. -
jakarta.persistence-apimoved from 3.0.0 to 3.2.0, andjakarta.annotation-apifrom 2.1.1 to 3.0.0, both optional dependencies representing Jakarta EE 11 API versions. Spring Boot 3.x managesjakarta.persistence-apiat 3.1.0, and that managed version continues to win in a Boot-managed project. -
The test-scope EL implementation moved from
javax.el/org.glassfish.web:el-impltojakarta.el/org.glassfish:jakarta.el. This affects the framework’s own bean-validation tests only; nothing changes on the published classpath. -
Deliberately not upgraded, to keep the LTS baseline intact: Spring Framework 5.3.39, Spring Boot 2.7.18, Spring Security 5.8.16, Hibernate ORM 5.6.15.Final, Hibernate Validator 6.2.5.Final, Ehcache 2.10.9.2, XStream 1.4.21, Avro 1.12.0, dom4j 2.1.5.
Bug fixes
-
Fixed the
framework4-springboot4example application configuration so it runs against a standalone Axon Server and in local development.
Dependency upgrades
Shipped and optional runtime dependencies:
| Dependency | From | To |
|---|---|---|
|
2.19.2 |
2.22.1 |
|
3.0.3 |
3.2.1 |
|
2.13.1 |
2.14.0 |
|
1.3.9 |
1.4.6 |
|
2.0.17 |
2.0.18 |
|
2.25.3 |
2.26.1 |
|
1.17.6 |
1.18.11 |
|
2.20.0 |
2.22.0 |
|
3.4.4 |
4.0.0 |
|
3.30.2-GA |
3.32.0-GA |
|
3.7.8 |
3.8.6 |
|
1.15.2 |
1.17.0 |
|
4.2.33 |
4.2.39 |
|
1.52.0 |
1.64.0 |
|
3.10.8 |
3.12.0 |
|
6.6.22.Final |
6.6.54.Final |
|
8.0.2.Final |
8.0.4.Final |
|
3.0.0 |
3.2.0 |
|
2.1.1 |
3.0.0 |
|
16.6.0 |
16.12.0 |
|
8.0.1 |
8.7.1 |
|
2.4.0 |
2.4.1 |
Removed from dependency management: com.eaio.uuid:uuid 3.2, javax.el:javax.el-api 3.0.1-b06, and org.glassfish.web:el-impl 2.2.
A second jakarta.persistence-api property that pinned JDK 11-compatible builds to 3.1.0 was dropped; all modules now resolve the single managed version.
Test-scope dependencies:
| Dependency | From | To |
|---|---|---|
|
5.13.4 |
6.1.2 |
|
4.11.0 |
5.18.0 |
|
0.9.1.2 |
0.14.1 |
|
2.5.2 |
2.7.4 |
|
9.3.0 |
9.7.0 |
|
42.7.7 |
42.7.13 |
|
23.8.0.25.04 |
23.26.2.0.0 |
|
1.20.3 |
1.21.4 |
|
1.52.0 |
1.64.0 |
The c3p0 coordinates changed group: the abandoned c3p0:c3p0 artifact is replaced by the maintained com.mchange:c3p0.
A JDK 11-specific HSQLDB pin (2.7.2) was dropped in favour of the single 2.7.4 version.
Unchanged: Awaitility 4.3.0, Hamcrest 3.0, JUnit 4.13.2, Testcontainers 2.0.5 (root), Axon Server Connector Java 2026.0.0.
Build plugins:
| Plugin | From | To |
|---|---|---|
|
3.14.0 |
3.15.0 |
|
3.5.3 |
3.5.6 |
|
3.5.3 |
3.5.6 |
|
3.6.1 |
3.6.3 |
|
3.4.2 |
3.5.0 |
|
3.3.1 |
3.4.0 |
|
3.11.2 |
3.12.0 |
|
3.7.1 |
3.8.0 |
|
3.3.1 |
3.5.0 |
|
3.1.1 |
3.3.1 |
|
0.8.13 |
0.8.15 |
The central-publishing-maven-plugin 0.8.0 was removed.
Documentation toolchain (build-time only, not shipped) and CI workflow actions (actions/checkout, actions/setup-java, actions/setup-node, actions/cache, actions/github-script, dependabot/fetch-metadata) were updated as well, and the Sonar analysis and Slack release-notification steps were removed from all workflows.