Appendix

Appendix A: Spring Boot Compatibility

Spring Modulith Version Spring Boot Version
(compiled against)
Spring Boot Version
(examples tested against)
jMolecules
(compiled)
jMolecules
(tested)

1.4 (snapshot)

3.4

3.1, 3.2, 3.3, 3.4

2023.2

2023.2, 2025.0 RC2

1.3

3.4

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

1.2

3.3

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

1.1

3.2

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

Appendix B: Spring Modulith Configuration Properties

Property Default value Description

spring.modulith.default-async-termination

true

Whether to configure defaults for the async processing termination, namely to wait for task completion for 2 seconds. See TaskExecutionProperties for details.

spring.modulith.detection-strategy

none

The strategy to be applied to detect application modules. Can either be the class name of a custom implementation of ApplicationModuleDetectionStrategy or direct-subpackages (which is also the final fallback if nothing is configured) or explicitly-annotated to only select packages explicitly annotated with @ApplicationModule or jMolecules' @Module. See Customize Application Module Detection for details.

spring.modulith.events.completion-mode

update

How to mark an event publication as completed. The following values are supported:

  • update (default) — Sets the completion date on the event publication entry.

  • delete — Removes the event publication entry. Completed event publications are not available via CompletedEventPublications.

  • archive — Removes the event publication entry from the primary database abstraction (table, collection or node) and creates one in a archive (a table, collection or node of same schema). For details, see Event Publication Completion.

spring.modulith.events.externalization.enabled

true

Whether to enable event externalization.

spring.modulith.events.jdbc.schema-initialization.enabled

false

Whether to initialize the JDBC event publication schema.

spring.modulith.events.jdbc.schema

The schema name for the event publication table. If not specified, the table will not be schema-qualified.

spring.modulith.events.kafka.enable-json

true

Whether to enable JSON support for KafkaTemplate.

spring.modulith.events.mongodb.transaction-management.enabled

true

Whether to automatically enable transactions for MongoDB. Requires the database to be run with a replica set.

spring.modulith.events.neo4j.event-index.enabled

false

Whether to create indexes on the .

spring.modulith.events.rabbitmq.enable-json

true

Whether to enable JSON support for RabbitTemplate.

spring.modulith.events.republish-outstanding-events-on-restart

false

Whether to republish outstanding event publications on restarts of the application. Usually not recommended in multi-instance deployments as other instances might still be processing events.

spring.modulith.moments.enableTimeMachine

false

Whether to enable the TimeMachine.

spring.modulith.moments.granularity

HOURS

The granularity of events to publish. (HOURS, DAYS)

spring.modulith.moments.locale

Locale.getDefault()

The Locale to use when determining week boundaries.

spring.modulith.moments.zoneId

ZoneOffset.UTC

The timezone of the dates for the events being published.

spring.modulith.republish-outstanding-events-on-restart

false

Deprecated as of 1.3. Prefer spring.modulith.events.republish-outstanding-events-on-restart.

spring.modulith.test.file-modification-detector

none

This can either be one of the predefined values uncommitted-changes, reference-commit, default or the fully-qualified class name of a FileModificationDetector that will be used to inspect which files of the projects have been changed. As the name suggests, uncommitted-changes will only consider changed files not already committed. reference-commit will consider all files changed since a given Git commit provided via spring.modulith.test.reference-commit, particularly useful CI environments in which that property could point to the commit hash of the last successful build. default detects all uncomitted changes and ones that have not been pushed to the current branch’s tracking branch which is primarily useful for local development.

spring.modulith.test.reference-commit

none

The commit hash of to which to calculate the set of changed files. Usually propagated in CI environments to consider all changes since the last successful build.

Appendix C: Spring Modulith modules

Table 1. Spring Modulith starter POMs
Starter Typical scope Includes

spring-modulith-starter-core

compile

  • spring-modulith-api

  • spring-modulith-apt

  • spring-modulith-moments

  • spring-modulith-core (runtime)

  • spring-modulith-runtime (runtime)

spring-modulith-starter-insight

runtime

  • spring-modulith-actuator (runtime)

  • spring-modulith-observability (runtime)

  • spring-boot-starter-actuator (runtime)

spring-modulith-starter-jdbc

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-jdbc (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-jpa

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-jpa (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-mongodb

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-mongodb (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-neo4j

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-neo4j (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-test

test

  • spring-modulith-docs

  • spring-modulith-test

Table 2. Individual Spring Modulith JARs
Module Typical scope Description

spring-modulith-actuator

runtime

A Spring Boot actuator to expose the application module structure via an actuator.

spring-modulith-api

compile

The abstractions to be used in your production code to customize Spring Modulith’s default behavior.

spring-modulith-apt

compile

An annotation processor to extract Javadoc for inclusion in Application Module Canvases.

spring-modulith-core

runtime

The core application module model and API.

spring-modulith-docs

test

The Documenter API to create Asciidoctor and PlantUML documentation from the module model.

spring-modulith-events-amqp

runtime

Event externalization support for AMQP.

spring-modulith-events-api

runtime

API to customize the event features of Spring Modulith.

spring-modulith-events-core

runtime

The core implementation of the event publication registry as well as the integration abstractions EventPublicationRegistry and EventPublicationSerializer.

spring-modulith-events-jackson

runtime

A Jackson-based implementation of the EventPublicationSerializer.

spring-modulith-events-jdbc

runtime

A JDBC-based implementation of the EventPublicationRegistry.

spring-modulith-events-jms

runtime

Event externalization support for JMS.

spring-modulith-events-jpa

runtime

A JPA-based implementation of the EventPublicationRegistry.

spring-modulith-events-kafka

runtime

Event externalization support for Kafka.

spring-modulith-events-messaging

runtime

Event externalization support into Spring Messaging MessageChannels.

spring-modulith-events-mongodb

runtime

A MongoDB-based implementation of the EventPublicationRegistry.

spring-modulith-events-neo4j

runtime

A Neo4j-based implementation of the EventPublicationRegistry.

spring-modulith-junit

test

Test execution optimizations based on the application module structure. Find more details here.

spring-modulith-moments

compile

The Passage of Time events implementation described here.

spring-modulith-observability

runtime

Observability infrastructure described here.

spring-modulith-runtime

runtime

Support to bootstrap an ApplicationModules instance at runtime. Usually not directly depended on but transitively used by spring-modulith-actuator and spring-modulith-observability.

spring-modulith-test

test

Integration testing support. Find more details here.

Appendix D: Deprecated modules

Table 3. Deprecated modules table
Module Deprecated since Description

spring-modulith-events-aws-sns

1.3

Please migrate to io.awspring.cloud:spring-cloud-aws-modulith-events-sns. See this link

spring-modulith-events-aws-sqs

1.3

Please migrate to io.awspring.cloud:spring-cloud-aws-modulith-events-sqs. See this link

Appendix E: Event publication registry schemas

The JDBC-based event publication registry support expects the following database schemas to be present in the database. If you would like Spring Modulith to create the schema for you, set the application property spring.modulith.events.jdbc-schema-initialization.enabled to true.

H2

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               UUID NOT NULL,
  COMPLETION_DATE  TIMESTAMP(9) WITH TIME ZONE,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(9) WITH TIME ZONE NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);

HSQLDB

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               UUID NOT NULL,
  COMPLETION_DATE  TIMESTAMP(9),
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(9) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);

MariaDB

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

Microsoft SQL Server

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION')
CREATE TABLE EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(MAX) NOT NULL,
  PUBLICATION_DATE DATETIME2(6) NOT NULL,
  COMPLETION_DATE  DATETIME2(6) NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

MySQL

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

PostgreSQL

CREATE TABLE IF NOT EXISTS event_publication
(
  id               UUID NOT NULL,
  listener_id      TEXT NOT NULL,
  event_type       TEXT NOT NULL,
  serialized_event TEXT NOT NULL,
  publication_date TIMESTAMP WITH TIME ZONE NOT NULL,
  completion_date  TIMESTAMP WITH TIME ZONE,
  PRIMARY KEY (id)
);
CREATE INDEX IF NOT EXISTS event_publication_serialized_event_hash_idx ON event_publication USING hash(serialized_event);
CREATE INDEX IF NOT EXISTS event_publication_by_completion_date_idx ON event_publication (completion_date);

Appendix F: Migrating from Moduliths

  • o.m.model.Modules has been renamed to o.s.m.model.ApplicationModules

  • o.m.model.ModuleDetectionStrategy has been renamed to o.s.m.model.ApplicationModuleDetectionStrategy

  • @o.m.test.ModuleTest has been renamed to @o.s.m.test.ApplicationModuleTest

  • o.m.docs.Documenter.Options has been renamed to o.s.m.docs.Documenter.DiagramOptions

  • The diagram style of component diagrams now defaults to DiagramStyle.C4 (override by calling DiagramOptions.withStyle(DiagramStyle.UML))

  • The module canvas hides non exposed types by default. To include application-module-internal types in the canvas, configure CanvasOptions to ….revealInternals().

  • The output folder for component diagrams and application module canvases has moved from moduliths-docs to spring-modulith-docs located in your build’s target folder (such as target for Maven).