From 1cc44cf065a414155aaeebb8864399a85be5ea34 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 7 Jul 2022 23:22:05 +0200 Subject: [PATCH] GH-2 - Upgrade to Spring Boot 3. Upgrade to Spring Boot 3 and Java 17 as project baselines. Removed legacy JavaEE modules and replaced them by ones compatible with JakartaEE 9. Disabled the Observability module for now as Spring Cloud Sleuth has been removed the Boot 3 compatible Spring Cloud branch and we need to migrate the module to Micrometer first. --- pom.xml | 16 +- .../springframework/modulith/model/Types.java | 2 +- .../ArchitecturallyEvidentTypeUnitTest.java | 8 +- spring-modulith-events/pom.xml | 1 - .../pom.xml | 96 ---------- .../events/jpa/JpaEventPublication.java | 59 ------ .../JpaEventPublicationAutoConfiguration.java | 26 --- .../jpa/JpaEventPublicationConfiguration.java | 44 ----- .../jpa/JpaEventPublicationRegistry.java | 175 ------------------ .../jpa/JpaEventPublicationRepository.java | 86 --------- .../modulith/events/jpa/package-info.java | 2 - .../META-INF/spring-devtools.properties | 1 - .../main/resources/META-INF/spring.factories | 6 - ...licationConfigurationIntegrationTests.java | 75 -------- ...PublicationRepositoryIntegrationTests.java | 118 ------------ .../src/test/resources/logback.xml | 16 -- .../spring-modulith-events-jpa/pom.xml | 39 +++- .../events/jpa/JpaEventPublication.java | 7 +- .../JpaEventPublicationAutoConfiguration.java | 4 +- .../jpa/JpaEventPublicationConfiguration.java | 2 +- .../jpa/JpaEventPublicationRegistry.java | 15 +- .../jpa/JpaEventPublicationRepository.java | 5 +- ...ot.autoconfigure.AutoConfiguration.imports | 2 - ...figure.AutoConfiguration.imports.factories | 0 ...licationConfigurationIntegrationTests.java | 5 +- ...PublicationRepositoryIntegrationTests.java | 9 +- .../spring-modulith-events-tests/pom.xml | 3 +- .../events/InfrastructureConfiguration.java | 5 +- .../myproject/stereotypes/Stereotypes.java | 2 - spring-modulith-starter-jpa-jakarta/pom.xml | 53 ------ 30 files changed, 70 insertions(+), 812 deletions(-) delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/pom.xml delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/package-info.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring-devtools.properties delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring.factories delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java delete mode 100644 spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/resources/logback.xml delete mode 100644 spring-modulith-events/spring-modulith-events-jpa/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports rename spring-modulith-events/{spring-modulith-events-jpa-jakarta => spring-modulith-events-jpa}/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.factories (100%) delete mode 100644 spring-modulith-starter-jpa-jakarta/pom.xml diff --git a/pom.xml b/pom.xml index 18b1cae9..51e7617b 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.1 + 3.0.0-SNAPSHOT @@ -22,10 +22,9 @@ spring-modulith-events spring-modulith-test spring-modulith-docs - spring-modulith-observability + spring-modulith-moments spring-modulith-starter-jpa - spring-modulith-starter-jpa-jakarta spring-modulith-starter-test @@ -111,6 +110,13 @@ limitations under the License. false + + spring-milestone + https://repo.spring.io/milestone + + false + + @@ -201,8 +207,8 @@ limitations under the License. org.apache.maven.plugins maven-compiler-plugin - 1.8 - 1.8 + 17 + 17 diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/model/Types.java b/spring-modulith-core/src/main/java/org/springframework/modulith/model/Types.java index 59de56f3..a4a10fd3 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/model/Types.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/model/Types.java @@ -82,7 +82,7 @@ class Types { @UtilityClass static class JavaXTypes { - private static final String BASE_PACKAGE = "javax"; + private static final String BASE_PACKAGE = "jakarta"; static final String AT_ENTITY = BASE_PACKAGE + ".persistence.Entity"; static final String AT_INJECT = BASE_PACKAGE + ".inject.Inject"; diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/model/ArchitecturallyEvidentTypeUnitTest.java b/spring-modulith-core/src/test/java/org/springframework/modulith/model/ArchitecturallyEvidentTypeUnitTest.java index 1409918b..b705fbd7 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/model/ArchitecturallyEvidentTypeUnitTest.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/model/ArchitecturallyEvidentTypeUnitTest.java @@ -17,24 +17,24 @@ package org.springframework.modulith.model; import static org.assertj.core.api.Assertions.*; +import jakarta.persistence.Entity; + import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.UUID; import java.util.stream.Stream; -import javax.persistence.Entity; - import org.jmolecules.event.annotation.DomainEventHandler; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestFactory; -import org.springframework.modulith.model.ArchitecturallyEvidentType.SpringAwareArchitecturallyEvidentType; -import org.springframework.modulith.model.ArchitecturallyEvidentType.SpringDataAwareArchitecturallyEvidentType; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.EventListener; import org.springframework.data.repository.CrudRepository; +import org.springframework.modulith.model.ArchitecturallyEvidentType.SpringAwareArchitecturallyEvidentType; +import org.springframework.modulith.model.ArchitecturallyEvidentType.SpringDataAwareArchitecturallyEvidentType; import org.springframework.stereotype.Repository; import com.tngtech.archunit.core.domain.JavaClass; diff --git a/spring-modulith-events/pom.xml b/spring-modulith-events/pom.xml index 531e173d..66719f03 100644 --- a/spring-modulith-events/pom.xml +++ b/spring-modulith-events/pom.xml @@ -16,7 +16,6 @@ spring-modulith-events-core spring-modulith-events-jpa - spring-modulith-events-jpa-jakarta spring-modulith-events-jackson spring-modulith-events-tests spring-modulith-events-starter diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/pom.xml b/spring-modulith-events/spring-modulith-events-jpa-jakarta/pom.xml deleted file mode 100644 index 73c8f27c..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/pom.xml +++ /dev/null @@ -1,96 +0,0 @@ - - 4.0.0 - - - org.springframework.experimental - spring-modulith-events - 0.1.0-SNAPSHOT - ../pom.xml - - - Spring Modulith - Events - Jakarta JPA-based registry - spring-modulith-events-jpa-jakarta - - - 17 - org.springframework.modulith.events.jpa.jakarta - 6.0.0-M1 - - - - - - ${project.groupId} - spring-modulith-events-core - ${project.version} - - - - - - jakarta.persistence - jakarta.persistence-api - 3.0.0 - - - - org.springframework.boot - spring-boot-autoconfigure - true - - - - - - jakarta.xml.bind - jakarta.xml.bind-api - 3.0.1 - test - - - - - org.hibernate.orm - hibernate-core - 6.0.0.CR2 - test - - - - jakarta.transaction - jakarta.transaction-api - 2.0.1-RC1 - test - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework - spring-orm - test - - - - org.hsqldb - hsqldb - test - - - - - - - spring-milestone - https://repo.spring.io/milestone - - false - - - - - \ No newline at end of file diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java deleted file mode 100644 index 92425f50..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; - -import java.time.Instant; -import java.util.UUID; - -/** - * @author Oliver Gierke - */ -@Data -@Entity -@NoArgsConstructor(force = true) -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) -class JpaEventPublication { - - private final @Id @Column(length = 16) UUID id; - private final Instant publicationDate; - private final String listenerId; - private final String serializedEvent; - private final Class eventType; - - private Instant completionDate; - - @Builder - static JpaEventPublication of(Instant publicationDate, String listenerId, Object serializedEvent, - Class eventType) { - return new JpaEventPublication(UUID.randomUUID(), publicationDate, listenerId, serializedEvent.toString(), - eventType); - } - - JpaEventPublication markCompleted() { - - this.completionDate = Instant.now(); - return this; - } -} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java deleted file mode 100644 index 058bb5d4..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import org.springframework.boot.autoconfigure.AutoConfigurationPackage; -import org.springframework.context.annotation.Configuration; - -/** - * @author Oliver Drotbohm - */ -@Configuration(proxyBeanMethods = false) -@AutoConfigurationPackage -class JpaEventPublicationAutoConfiguration {} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java deleted file mode 100644 index 59affa96..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import lombok.RequiredArgsConstructor; - -import jakarta.persistence.EntityManager; - -import org.springframework.modulith.events.EventSerializer; -import org.springframework.modulith.events.config.EventPublicationConfigurationExtension; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @author Oliver Gierke - */ -@Configuration(proxyBeanMethods = false) -@RequiredArgsConstructor -class JpaEventPublicationConfiguration implements EventPublicationConfigurationExtension { - - @Bean - public JpaEventPublicationRegistry jpaEventPublicationRegistry(JpaEventPublicationRepository repository, - EventSerializer serializer) { - return new JpaEventPublicationRegistry(repository, serializer); - } - - @Bean - public JpaEventPublicationRepository jpaEventPublicationRepository(EntityManager em) { - return new JpaEventPublicationRepository(em); - } -} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java deleted file mode 100644 index 82c01e3d..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2017-2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import lombok.EqualsAndHashCode; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.time.Instant; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.springframework.modulith.events.CompletableEventPublication; -import org.springframework.modulith.events.EventPublication; -import org.springframework.modulith.events.EventPublicationRegistry; -import org.springframework.modulith.events.EventSerializer; -import org.springframework.modulith.events.PublicationTargetIdentifier; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; - -/** - * JPA based {@link EventPublicationRegistry}. - * - * @author Oliver Gierke - */ -@Slf4j -@RequiredArgsConstructor -class JpaEventPublicationRegistry implements EventPublicationRegistry, DisposableBean { - - private final @NonNull JpaEventPublicationRepository events; - private final @NonNull EventSerializer serializer; - - /* - * (non-Javadoc) - * @see org.springframework.events.EventPublicationRegistry#store(java.lang.Object, java.util.Collection) - */ - @Override - public void store(Object event, Stream listeners) { - - listeners.map(it -> CompletableEventPublication.of(event, it)) // - .map(this::map) // - .forEach(it -> events.create(it)); - } - - /* - * (non-Javadoc) - * @see org.springframework.events.EventPublicationRegistry#findIncompletePublications() - */ - @Override - public Iterable findIncompletePublications() { - - List result = events.findByCompletionDateIsNull().stream() // - .map(it -> JpaEventPublicationAdapter.of(it, serializer)) // - .collect(Collectors.toList()); - - return result; - } - - /* - * (non-Javadoc) - * @see org.springframework.events.EventPublicationRegistry#markCompleted(java.lang.Object, org.springframework.events.ListenerId) - */ - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void markCompleted(Object event, PublicationTargetIdentifier listener) { - - Assert.notNull(event, "Domain event must not be null!"); - Assert.notNull(listener, "Listener identifier must not be null!"); - - events.findBySerializedEventAndListenerId(serializer.serialize(event), listener.toString()) // - .map(JpaEventPublicationRegistry::LOGCompleted) // - .ifPresent(it -> events.update(it.markCompleted())); - } - - /* - * (non-Javadoc) - * @see org.springframework.beans.factory.DisposableBean#destroy() - */ - @Override - public void destroy() throws Exception { - - List publications = events.findByCompletionDateIsNull(); - - if (publications.isEmpty()) { - - LOG.info("No publications outstanding!"); - return; - } - - LOG.info("Shutting down with the following publications left unfinished:"); - - for (int i = 0; i < publications.size(); i++) { - - String prefix = (i + 1) == publications.size() ? "└─" : "├─"; - JpaEventPublication it = publications.get(i); - - LOG.info("{} {} - {} - {}", prefix, it.getId(), it.getEventType().getName(), it.getListenerId()); - } - } - - private JpaEventPublication map(EventPublication publication) { - - JpaEventPublication result = JpaEventPublication.builder() // - .eventType(publication.getEvent().getClass()) // - .publicationDate(publication.getPublicationDate()) // - .listenerId(publication.getTargetIdentifier().toString()) // - .serializedEvent(serializer.serialize(publication.getEvent()).toString()) // - .build(); - - LOG.debug("Registering publication of {} with id {} for {}.", // - result.getEventType(), result.getId(), result.getListenerId()); - - return result; - } - - private static JpaEventPublication LOGCompleted(JpaEventPublication publication) { - - LOG.debug("Marking publication of event {} with id {} to listener {} completed.", // - publication.getEventType(), publication.getId(), publication.getListenerId()); - - return publication; - } - - @EqualsAndHashCode - @RequiredArgsConstructor(staticName = "of") - static class JpaEventPublicationAdapter implements EventPublication { - - private final JpaEventPublication publication; - private final EventSerializer serializer; - - /* - * (non-Javadoc) - * @see org.springframework.events.EventPublication#getEvent() - */ - @Override - public Object getEvent() { - return serializer.deserialize(publication.getSerializedEvent(), publication.getEventType()); - } - - /* - * (non-Javadoc) - * @see org.springframework.events.EventPublication#getListenerId() - */ - @Override - public PublicationTargetIdentifier getTargetIdentifier() { - return PublicationTargetIdentifier.of(publication.getListenerId()); - } - - /* - * (non-Javadoc) - * @see org.springframework.events.EventPublication#getPublicationDate() - */ - @Override - public Instant getPublicationDate() { - return publication.getPublicationDate(); - } - } -} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java deleted file mode 100644 index 57155e4c..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.TypedQuery; -import lombok.RequiredArgsConstructor; - -import java.util.List; -import java.util.Optional; - -import org.springframework.transaction.annotation.Transactional; - -/** - * Repository to store {@link JpaEventPublication}s. - * - * @author Oliver Drotbohm - */ -@RequiredArgsConstructor -public class JpaEventPublicationRepository { - - private final EntityManager entityManager; - - @Transactional - JpaEventPublication create(JpaEventPublication publication) { - - entityManager.persist(publication); - return publication; - } - - @Transactional - JpaEventPublication update(JpaEventPublication publication) { - - entityManager.merge(publication); - entityManager.flush(); - - return publication; - } - - /** - * Returns all {@link JpaEventPublication} that have not been completed yet. - */ - @Transactional(readOnly = true) - List findByCompletionDateIsNull() { - - String query = "select p from JpaEventPublication p where p.completionDate is null"; - - return entityManager.createQuery(query, JpaEventPublication.class).getResultList(); - } - - /** - * Return the {@link JpaEventPublication} for the given serialized event and listener identifier. - * - * @param event must not be {@literal null}. - * @param listenerId must not be {@literal null}. - * @return - */ - @Transactional(readOnly = true) - Optional findBySerializedEventAndListenerId(Object event, String listenerId) { - - String query = "select p from JpaEventPublication p where p.serializedEvent = ?1 and p.listenerId = ?2"; - - TypedQuery typedQuery = entityManager.createQuery(query, JpaEventPublication.class) - .setParameter(1, event) - .setParameter(2, listenerId); - - try { - return Optional.of(typedQuery.getSingleResult()); - } catch (Exception o_O) { - return Optional.empty(); - } - } -} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/package-info.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/package-info.java deleted file mode 100644 index 9a6858fd..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/java/org/springframework/modulith/events/jpa/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -@org.springframework.lang.NonNullApi -package org.springframework.modulith.events.jpa; diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring-devtools.properties b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring-devtools.properties deleted file mode 100644 index 4ebaf768..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring-devtools.properties +++ /dev/null @@ -1 +0,0 @@ -restart.include.spring-modulith-events:/spring-modulith-events-jpa-[\\w-\\.]+\.jar diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring.factories b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 66c6805f..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,6 +0,0 @@ -org.springframework.modulith.events.config.EventPublicationConfigurationExtension=\ - org.springframework.modulith.events.jpa.JpaEventPublicationConfiguration - -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - org.springframework.modulith.events.jpa.JpaEventPublicationAutoConfiguration,\ - org.springframework.modulith.events.jpa.JpaEventPublicationConfiguration diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java deleted file mode 100644 index 5be78a68..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.TypedQuery; -import lombok.RequiredArgsConstructor; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.modulith.events.EventSerializer; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestConstructor; -import org.springframework.test.context.TestConstructor.AutowireMode; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -/** - * @author Oliver Drotbohm - */ -@ExtendWith(SpringExtension.class) -@TestConstructor(autowireMode = AutowireMode.ALL) -@RequiredArgsConstructor -public class JpaEventPublicationConfigurationIntegrationTests { - - private final ApplicationContext context; - - @Configuration - @Import(JpaEventPublicationConfiguration.class) - static class TestConfig { - - @Bean - EventSerializer eventSerializer() { - return mock(EventSerializer.class); - } - - @Bean - EntityManager entityManager() { - - EntityManager em = mock(EntityManager.class); - - // Mock API for query executed at bootstrap time - TypedQuery query = mock(TypedQuery.class); - doReturn(query).when(em).createQuery(any(String.class), any()); - - return em; - } - } - - @Test - void bootstrapsApplicationComponents() { - - assertThat(context.getBean(JpaEventPublicationRegistry.class)).isNotNull(); - assertThat(context.getBean(JpaEventPublicationRepository.class)).isNotNull(); - } -} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java deleted file mode 100644 index 870d5a58..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.modulith.events.jpa; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityManagerFactory; -import lombok.RequiredArgsConstructor; - -import java.time.Instant; - -import javax.sql.DataSource; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.modulith.events.EventSerializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.SharedEntityManagerCreator; -import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.test.context.TestConstructor; -import org.springframework.test.context.TestConstructor.AutowireMode; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author Oliver Drotbohm - */ -@ExtendWith(SpringExtension.class) -@TestConstructor(autowireMode = AutowireMode.ALL) -@Transactional -@RequiredArgsConstructor -class JpaEventPublicationRepositoryIntegrationTests { - - @Configuration - @Import(JpaEventPublicationConfiguration.class) - static class TestConfig { - - @Bean - EventSerializer eventSerializer() { - return mock(EventSerializer.class); - } - - // Database - - @Bean - EmbeddedDatabase hsqlDatabase() { - return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL).build(); - } - - // JPA - - @Bean - LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { - - AbstractJpaVendorAdapter vendor = new HibernateJpaVendorAdapter(); - vendor.setGenerateDdl(true); - - LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); - factory.setJpaVendorAdapter(vendor); - factory.setDataSource(dataSource); - factory.setPackagesToScan(getClass().getPackage().getName()); - - return factory; - } - - @Bean - EntityManager entityManager(EntityManagerFactory factory) { - return SharedEntityManagerCreator.createSharedEntityManager(factory); - } - - @Bean - JpaTransactionManager transactionManager(EntityManagerFactory factory) { - return new JpaTransactionManager(factory); - } - } - - private final JpaEventPublicationRepository repository; - - @Test - void persistsJpaEventPublication() { - - JpaEventPublication publication = JpaEventPublication.of(Instant.now(), "listener", "", Object.class); - - // Store publication - repository.create(publication); - - assertThat(repository.findByCompletionDateIsNull()).containsExactly(publication); - assertThat(repository.findBySerializedEventAndListenerId("", "listener")).isPresent(); - - // Complete publication - repository.update(publication.markCompleted()); - - assertThat(repository.findByCompletionDateIsNull()).isEmpty(); - } -} diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/resources/logback.xml b/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/resources/logback.xml deleted file mode 100644 index 1200a71e..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/test/resources/logback.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - %d %5p %40.40c:%4L - %m%n - - - - - - - - - - diff --git a/spring-modulith-events/spring-modulith-events-jpa/pom.xml b/spring-modulith-events/spring-modulith-events-jpa/pom.xml index 6d8031ac..5aa3d6d9 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jpa/pom.xml @@ -12,6 +12,7 @@ spring-modulith-events-jpa + 17 org.springframework.modulith.events.jpa @@ -23,11 +24,11 @@ ${project.version} - + - javax.persistence - javax.persistence-api + jakarta.persistence + jakarta.persistence-api @@ -37,13 +38,27 @@ - + - org.hibernate - hibernate-core + jakarta.xml.bind + jakarta.xml.bind-api test - + + + + org.hibernate.orm + hibernate-core + 6.1.1.Final + test + + + + jakarta.transaction + jakarta.transaction-api + test + + org.springframework.boot spring-boot-starter-test @@ -64,4 +79,14 @@ + + + spring-milestone + https://repo.spring.io/milestone + + false + + + + \ No newline at end of file diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java index 74f501a9..92425f50 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublication.java @@ -15,6 +15,9 @@ */ package org.springframework.modulith.events.jpa; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; import lombok.AccessLevel; import lombok.Builder; import lombok.Data; @@ -24,10 +27,6 @@ import lombok.RequiredArgsConstructor; import java.time.Instant; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; - /** * @author Oliver Gierke */ diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java index d9f0384e..058bb5d4 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationAutoConfiguration.java @@ -23,6 +23,4 @@ import org.springframework.context.annotation.Configuration; */ @Configuration(proxyBeanMethods = false) @AutoConfigurationPackage -class JpaEventPublicationAutoConfiguration { - -} +class JpaEventPublicationAutoConfiguration {} diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java index 4b7190b1..59affa96 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfiguration.java @@ -17,7 +17,7 @@ package org.springframework.modulith.events.jpa; import lombok.RequiredArgsConstructor; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; import org.springframework.modulith.events.EventSerializer; import org.springframework.modulith.events.config.EventPublicationConfigurationExtension; diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java index 3f1df1d2..82c01e3d 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2022 the original author or authors. + * Copyright 2017-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -85,7 +85,7 @@ class JpaEventPublicationRegistry implements EventPublicationRegistry, Disposabl Assert.notNull(listener, "Listener identifier must not be null!"); events.findBySerializedEventAndListenerId(serializer.serialize(event), listener.toString()) // - .map(JpaEventPublicationRegistry::logCompleted) // + .map(JpaEventPublicationRegistry::LOGCompleted) // .ifPresent(it -> events.update(it.markCompleted())); } @@ -130,7 +130,7 @@ class JpaEventPublicationRegistry implements EventPublicationRegistry, Disposabl return result; } - private static JpaEventPublication logCompleted(JpaEventPublication publication) { + private static JpaEventPublication LOGCompleted(JpaEventPublication publication) { LOG.debug("Marking publication of event {} with id {} to listener {} completed.", // publication.getEventType(), publication.getId(), publication.getListenerId()); @@ -145,20 +145,13 @@ class JpaEventPublicationRegistry implements EventPublicationRegistry, Disposabl private final JpaEventPublication publication; private final EventSerializer serializer; - private Object deserializedEvent; - /* * (non-Javadoc) * @see org.springframework.events.EventPublication#getEvent() */ @Override public Object getEvent() { - - if (deserializedEvent == null) { - this.deserializedEvent = serializer.deserialize(publication.getSerializedEvent(), publication.getEventType()); - } - - return deserializedEvent; + return serializer.deserialize(publication.getSerializedEvent(), publication.getEventType()); } /* diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java index c90afe40..57155e4c 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/main/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepository.java @@ -15,14 +15,13 @@ */ package org.springframework.modulith.events.jpa; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; import lombok.RequiredArgsConstructor; import java.util.List; import java.util.Optional; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; - import org.springframework.transaction.annotation.Transactional; /** diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-modulith-events/spring-modulith-events-jpa/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index dc43aae2..00000000 --- a/spring-modulith-events/spring-modulith-events-jpa/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.modulith.events.jpa.JpaEventPublicationAutoConfiguration -org.springframework.modulith.events.jpa.JpaEventPublicationConfiguration diff --git a/spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.factories b/spring-modulith-events/spring-modulith-events-jpa/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.factories similarity index 100% rename from spring-modulith-events/spring-modulith-events-jpa-jakarta/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.factories rename to spring-modulith-events/spring-modulith-events-jpa/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.factories diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java index ca2a59dd..5be78a68 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationConfigurationIntegrationTests.java @@ -19,11 +19,10 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; import lombok.RequiredArgsConstructor; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.modulith.events.EventSerializer; diff --git a/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java index 3d0ff48d..870d5a58 100644 --- a/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jpa/src/test/java/org/springframework/modulith/events/jpa/JpaEventPublicationRepositoryIntegrationTests.java @@ -18,12 +18,12 @@ package org.springframework.modulith.events.jpa; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import lombok.RequiredArgsConstructor; import java.time.Instant; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.junit.jupiter.api.Test; @@ -102,14 +102,13 @@ class JpaEventPublicationRepositoryIntegrationTests { @Test void persistsJpaEventPublication() { - String listenerId = "listener"; - JpaEventPublication publication = JpaEventPublication.of(Instant.now(), listenerId, "", Object.class); + JpaEventPublication publication = JpaEventPublication.of(Instant.now(), "listener", "", Object.class); // Store publication repository.create(publication); assertThat(repository.findByCompletionDateIsNull()).containsExactly(publication); - assertThat(repository.findBySerializedEventAndListenerId("", listenerId)).isPresent(); + assertThat(repository.findBySerializedEventAndListenerId("", "listener")).isPresent(); // Complete publication repository.update(publication.markCompleted()); diff --git a/spring-modulith-events/spring-modulith-events-tests/pom.xml b/spring-modulith-events/spring-modulith-events-tests/pom.xml index 6a7dfb7e..693e39b0 100644 --- a/spring-modulith-events/spring-modulith-events-tests/pom.xml +++ b/spring-modulith-events/spring-modulith-events-tests/pom.xml @@ -34,8 +34,9 @@ - org.hibernate + org.hibernate.orm hibernate-core + 6.1.1.Final diff --git a/spring-modulith-events/spring-modulith-events-tests/src/test/java/example/events/InfrastructureConfiguration.java b/spring-modulith-events/spring-modulith-events-tests/src/test/java/example/events/InfrastructureConfiguration.java index cfb86bd4..0bf2c582 100644 --- a/spring-modulith-events/spring-modulith-events-tests/src/test/java/example/events/InfrastructureConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-tests/src/test/java/example/events/InfrastructureConfiguration.java @@ -15,8 +15,9 @@ */ package example.events; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; + import javax.sql.DataSource; import org.springframework.context.annotation.Bean; diff --git a/spring-modulith-sample/src/main/java/com/acme/myproject/stereotypes/Stereotypes.java b/spring-modulith-sample/src/main/java/com/acme/myproject/stereotypes/Stereotypes.java index 0523dc05..c7d9fe4b 100644 --- a/spring-modulith-sample/src/main/java/com/acme/myproject/stereotypes/Stereotypes.java +++ b/spring-modulith-sample/src/main/java/com/acme/myproject/stereotypes/Stereotypes.java @@ -18,7 +18,6 @@ package com.acme.myproject.stereotypes; import lombok.Value; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.ConstructorBinding; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; @@ -67,7 +66,6 @@ public class Stereotypes { static class SomeAppInterfaceImplementation implements SomeAppInterface {} @Value - @ConstructorBinding @ConfigurationProperties("org.springframework.modulith.sample") static class SomeConfigurationProperties { diff --git a/spring-modulith-starter-jpa-jakarta/pom.xml b/spring-modulith-starter-jpa-jakarta/pom.xml deleted file mode 100644 index 01d0aba1..00000000 --- a/spring-modulith-starter-jpa-jakarta/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 4.0.0 - - - org.springframework.experimental - spring-modulith - 0.1.0-SNAPSHOT - - - spring-modulith-starter-jpa-jakarta - Spring Modulith - Starter JPA (Jakarta) - - - org.springframework.modulith.starter.jpa.jakarta - - - - - - org.springframework.experimental - spring-modulith-api - 0.1.0-SNAPSHOT - - - org.springframework.experimental - spring-modulith-moments - 0.1.0-SNAPSHOT - - - - - - org.springframework.experimental - spring-modulith-events-core - 0.1.0-SNAPSHOT - - - org.springframework.experimental - spring-modulith-events-jackson - 0.1.0-SNAPSHOT - runtime - - - org.springframework.experimental - spring-modulith-events-jpa-jakarta - 0.1.0-SNAPSHOT - runtime - - - - - \ No newline at end of file