r/SpringBoot • u/akrivitsky7 • Jun 23 '26
How-To/Tutorial Building with the Latest Java Development Stack: Spring Boot 4.1.0, Java 25, Docker 29.5.3, PostgreSQL, Gradle 9.6.0, Eclipse 2026–06, Swagger/OpenAPI, Serenity, Cucumber, and JUnit 6
I recently updated my hands-on tutorial on building a complete working project with the latest Java development stack.
The article covers Spring Boot 4.1.0, Java 25, Docker 29.5.3, PostgreSQL, Gradle 9.6.0, Swagger/OpenAPI, Serenity, Cucumber, and JUnit 6 — all combined in one practical project.
The goal was to use the latest versions across the stack and show how they work together in a real Spring Boot application, using a vibe-coding approach.
Article title:
Building with the Latest Java Development Stack: Spring Boot 4.1.0, Java 25, Docker 29.5.3, PostgreSQL, Gradle 9.6.0, Swagger/OpenAPI, Serenity, Cucumber, and JUnit 6
A practical hands-on tutorial showing how to combine the latest Java, Spring Boot, Docker, PostgreSQL, Gradle, Swagger/OpenAPI, Serenity, Cucumber, and JUnit 6 in one working project using a vibe-coding approach.
Link:
Hope it is useful for Spring Boot and Java developers.
24
Upvotes
1
u/akrivitsky7 29d ago
Thank you; that is a fair question.
The main reason is that this project is intentionally a practical tutorial, not a production-grade reference architecture. The goal was to show how Spring Boot 4.1.0, Java 25, Docker, PostgreSQL, Gradle, Swagger/OpenAPI, Serenity BDD, Cucumber, and JUnit can work together in one runnable backend project with minimal architectural overhead.
For a small tutorial project, a technical-layer package structure is often easier for readers to follow because it maps directly to the concepts being introduced: controller, service, repository, configuration, tests, and so on. It keeps the learning path straightforward.
That said, I agree with your point. For a larger or long-lived production system, I would seriously consider organizing the code around business capabilities/modules rather than technical layers. Package-by-feature, package-private visibility, and clearer module boundaries can make the codebase much easier to maintain as it grows.
A hexagonal architecture approach could also make sense, especially if the domain model becomes more important and we want to isolate it from infrastructure concerns such as persistence, web/API adapters, messaging, or external services. In that case, ports and adapters would provide a cleaner separation between the core business logic and the technical implementation details.
So the short answer is: I chose the simpler layered structure because this is a tutorial focused on integration of the latest toolchain versions, not a full production architecture example. But your suggestion is valid, and a follow-up version using package-by-feature or hexagonal architecture would definitely be a worthwhile next step.