Spring Boot

Introduction

The Spring Framework is an application framework and inversion of control container for the Java platform.


Spring Boot Architecture

https://dev.to/maddy/spring-boot-architecture-547i

Compatibility matrix

Reference (single page), for specific version replace "current", eg by "2.6.0-M2" :

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

-For 'JDK' version, search "requires Java" text in section "System requirements"

-For 'Spring' version, search for "Spring Framework" text in section "System requirements"

-For 'Maven' version, search for "Maven" build tool in section "System requirements"


Spring Boot    | Spring          | JDK   | Maven

3.1.5          | 6.0.13+         |[17,21]| 3.6.3+

3.1.4          | 6.0.12+         |[17,20]| 3.6.3+

3.0.0          | 6.0.2+          |[17,19]| 3.5+

2.7.4          | 5.3.23+         |[ 8,19]| 3.5+

2.5.5          | 5.3.10+         |[ 8,17]| 3.5+

2.5.4          | 5.3.9+          |[ 8,16]| 3.5+

2.4.3          | 5.3.4+          |[ 8,15]| 3.3+ 

2.1.18.RELEASE | 5.1.19.RELEASE+ |[ 8,12]| 3.3+ 

2.0.9.RELEASE  | 5.0.13.RELEASE+ |[ 8, 9]| 3.2+

1.5.22.RELEASE | 4.3.25.RELEASE+ |[ 6, 8]| 3.2+

jakarta vs javax

Only javax usage inside Jakarta EE is affected by modification restrictions. Several javax package exist outside Jakarta EE and are therefore in no way affected.

-Use v3 of spring-boot-starter-parent

Known changes (jakarta replaced javax)

jakarta.validation                   javax.validation

jakarta.inject                       javax.inject

    Remove dependency javax.inject:javax.inject

    Add dependency    jakarta.inject:jakarta.inject-api

jakarta.persistence                  javax.persistence

jakarta.annotation.PreDestroy        javax.annotation.PreDestroy

jakarta.servlet.*                    javax.servlet.*

jakarta.transaction.Transactional    javax.transaction.Transactional

jakarta.xml.ws.BindingProvider       javax.xml.ws.BindingProvider


Doesn't change (javax only)

javax.accessibility

javax.activity

javax.annotation.processing

javax.crypto

javax.crypto.interfaces

javax.crypto.spec

javax.help

javax.help.event

javax.help.plaf

javax.help.plaf.basic

javax.help.plaf.gtk

javax.help.resources

javax.help.search

javax.imageio

javax.imageio.event

javax.imageio.metadata

javax.imageio.plugins.bmp

javax.imageio.plugins.jpeg

javax.imageio.plugins.tiff

javax.imageio.spi

javax.imageio.stream

javax.jnlp

javax.lang.model

javax.lang.model.element

javax.lang.model.type

javax.lang.model.util

javax.management

javax.management.loading

javax.management.modelmbean

javax.management.monitor

javax.management.openmbean

javax.management.relation

javax.management.remote

javax.management.remote.rmi

javax.management.timer

javax.naming

javax.naming.directory

javax.naming.event

javax.naming.ldap

javax.naming.spi

javax.net

javax.net.ssl

javax.print

javax.print.attribute

javax.print.attribute.standard

javax.print.event

javax.rmi

javax.rmi.CORBA

javax.rmi.ssl

javax.script

javax.security.auth

javax.security.auth.callback

javax.security.auth.kerberos

javax.security.auth.login

javax.security.auth.spi

javax.security.auth.x500

javax.security.cert

javax.security.sasl

javax.smartcardio

javax.sound.midi

javax.sound.midi.spi

javax.sound.sampled

javax.sound.sampled.spi

javax.sql

javax.sql.rowset

javax.sql.rowset.serial

javax.sql.rowset.spi

javax.swing

javax.swing.beaninfo.images

javax.swing.border

javax.swing.colorchooser

javax.swing.event

javax.swing.filechooser

javax.swing.plaf

javax.swing.plaf.basic

javax.swing.plaf.metal

javax.swing.plaf.multi

javax.swing.plaf.nimbus

javax.swing.plaf.synth

javax.swing.table

javax.swing.text

javax.swing.text.html

javax.swing.text.html.parser

javax.swing.text.rtf

javax.swing.tree

javax.swing.undo

javax.tools

javax.transaction.xa (but jakarta.transaction.Transactional)

javax.xml (but jakarta.xml.ws.BindingProvider)

javax.xml.catalog

javax.xml.crypto

javax.xml.crypto.dom

javax.xml.crypto.dsig

javax.xml.crypto.dsig.dom

javax.xml.crypto.dsig.keyinfo

javax.xml.crypto.dsig.spec

javax.xml.datatype

javax.xml.namespace

javax.xml.parsers

javax.xml.stream

javax.xml.stream.events

javax.xml.stream.util

javax.xml.transform

javax.xml.transform.dom

javax.xml.transform.sax

javax.xml.transform.stax

javax.xml.transform.stream

javax.xml.validation

javax.xml.xpath

Spring Boot 3 (upgrade to)

-Use v3 of spring-boot-starter-parent

-Remove dependency javax.persistence:javax.persistence-api

-Remove dependency javax.xml.bind:jaxb-api

-Remove dependency org.glassfish.jaxb:jaxb-runtime (previously used by goal sonar:sonar)

-Exclude jaxb-api from dependency liquibase-core:

      <exclusions>

        <exclusion>

          <!-- sb3. Now using jakarta only -->

          <groupId>javax.xml.bind</groupId>

          <artifactId>jaxb-api</artifactId>

        </exclusion>

      </exclusions>

-Property jaxws-ri-version

    <jaxws-ri-version>4.0.0<!--sb3 2.3.5--></jaxws-ri-version>

-wsimport dependencies:

    <!--sb3 jakarta (wsimport) -->

    <dependency>

      <groupId>com.sun.xml.ws</groupId>

      <artifactId>jaxws-tools</artifactId>

      <version>4.0.0</version>

    </dependency>

    <!--sb3 jakarta (wsimport) -->

    <dependency>

      <groupId>jakarta.xml.ws</groupId>

      <artifactId>jakarta.xml.ws-api</artifactId>

      <!--version>4.0.0</version-->

    </dependency>

    <!--sb3 jakarta (wsimport) -->

    <dependency>

      <groupId>jakarta.xml.bind</groupId>

      <artifactId>jakarta.xml.bind-api</artifactId>

      <!--version>4.0.0</version-->

    </dependency>

    <!--sb3 jakarta (wsimport) -->

    <dependency>

      <groupId>jakarta.activation</groupId>

      <artifactId>jakarta.activation-api</artifactId>

      <!--version>2.1.0</version-->

    </dependency>

    <!--sb3 jakarta (wsimport) -->

    <dependency>

      <groupId>com.sun.xml.ws</groupId>

      <artifactId>jaxws-rt</artifactId>

      <version>4.0.0</version>

    </dependency>

-Remove, if not needed dependency "spring-webflux" (reactive-stack web framework)

-Upgrade version of swagger-parser:

    <!-- (sb3) Swagger v3 annotations (springdoc & openapi-generator) -->

    <dependency>

      <groupId>io.swagger.parser.v3</groupId>

      <artifactId>swagger-parser</artifactId>

      <version>2.1.9</version>

    </dependency>

-Dependency com.sun.xml.ws:jaxws-maven-plugin bumped to 4.0.0.

Changes to the dependencies subsection of jaxws-maven-plugin:

          <!--sb3 jakarta (wsimport) -->

          <dependency>

            <groupId>jakarta.xml.ws</groupId>

            <artifactId>jakarta.xml.ws-api</artifactId>

            <version>4.0.0</version>

          </dependency>

          <!--sb3 jakarta (wsimport) -->

          <dependency>

            <groupId>jakarta.xml.bind</groupId>

            <artifactId>jakarta.xml.bind-api</artifactId>

            <version>4.0.0</version>

          </dependency>

          <!--sb3 jakarta (wsimport) -->

          <dependency>

            <groupId>jakarta.activation</groupId>

            <artifactId>jakarta.activation-api</artifactId>

            <version>2.1.0</version>

          </dependency>

          <!--sb3 jakarta (wsimport) -->

          <dependency>

            <groupId>com.sun.xml.ws</groupId>

            <artifactId>jaxws-rt</artifactId>

            <version>4.0.0</version>

          </dependency>

          

          <!-- (sb3 removed) put the XJC plugins on the jaxws-maven-plugin's classpath

          <dependency>

            <groupId>org.jvnet.jaxb2_commons</groupId>

            <artifactId>jaxb2-basics</artifactId>

            <version>1.11.1</version>

          </dependency>

          -->

          

          <!--sb3 [put the XJC plugins on the jaxws-maven-plugin's classpath] instead of org.jvnet.jaxb2_commons:jaxb2-basics-->

          <dependency>

            <groupId>com.evolvedbinary.maven.jvnet</groupId>

            <artifactId>jaxb30-maven-plugin</artifactId>

            <version>0.15.0</version>

          </dependency>

          

          <!-- (sb3) put XJC value constructor plugin classpath -->

          <dependency>

            <groupId>org.jvnet.jaxb2_commons</groupId>

            <artifactId>jaxb2-value-constructor</artifactId>

            <version>3.0</version>

          </dependency>

Changes to the configuration/xjcArgs subsection of jaxws-maven-plugin:

<!--(sb3)<xjcArg>-XtoString</xjcArg>-->

-Replace maven-compiler-plugin configuration/annotationProcessorPaths/path 'org.hibernate':

            <!--sb3 added .orm-->

            <path>

              <groupId>org.hibernate.orm</groupId>

              <artifactId>hibernate-jpamodelgen</artifactId>

              <version>${hibernate.version}</version>

            </path>

-Springdoc property

    <springdoc-openapi.version>2.0.0<!--(sb3)Fails w/ [2.0.1 .. 2.0.2]--></springdoc-openapi.version>

-Springdoc dependencies, replace the v1 by the v2 ones:

    <!-- [Swagger-UI] For spring-boot v3 support, make sure you use springdoc-openapi v2 -->

    <dependency>

      <groupId>org.springdoc</groupId>

      <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>

      <version>${springdoc-openapi.version}</version>

    </dependency>

    <!-- [Swagger-UI] Supports spring-data-rest, spring-security and javadoc -->

    <dependency>

      <groupId>org.springdoc</groupId>

      <artifactId>springdoc-openapi-starter-common</artifactId>

      <version>${springdoc-openapi.version}</version>

    </dependency>

-Springoc import import org.springdoc.core.GroupedOpenApi replaced by:

import org.springdoc.core.models.GroupedOpenApi;

-jakarta.validation replaces import javax.validation

-javax.inject replaces import javax.inject:

  Remove dependency javax.inject:javax.inject

  Add dependency jakarta.inject:jakarta.inject-api

-jakarta.persistence replaces import javax.persistence

-jakarta.annotation.PreDestroy replaces import javax.annotation.PreDestroy

-jakarta.servlet.* replaces javax.servlet.*

-jakarta.transaction.Transactional replaces import javax.transaction.Transactional

-jakarta.xml.ws.BindingProvider replaces import javax.xml.ws.BindingProvider

-If using 'openapi-generator-maven-plugin' then:

Activate flag 'openapi-generator-maven-plugin' for the flag to generate jakarta instead of javax [https://sites.google.com/site/pawneecity/sprint-boot/client-rest-with-maven-spring-boot/openapi-generator-maven-plugin-client-rest]


And add to pom.xml dependency for compiling '@javax.annotation.Generated':

Note: For Client generated code, it can be avoided using also <useJakartaEe>true</useJakartaEe>

    <!-- Needed for compiling openapi @javax.annotation.Generated even if using 'useSpringBoot3' (sb3) -->

    <dependency>

      <groupId>javax.annotation</groupId>

      <artifactId>javax.annotation-api</artifactId>

      <version>1.3.2</version>

    </dependency>

-src/main/resources/jaxws

Modify for jakarta according to [https://sites.google.com/site/pawneecity/sprint-boot/client-soap-with-maven-spring-boot]

-If using spring security, modify the SecurityFilterChain

-If using @EnableGlobalMethodSecurity, replace it by @Configuration @EnableMethodSecurity

For role hierarchy, see [https://sites.google.com/site/pawneecity/sprint-boot/authorization-custom-spring-boot#h.p_36V053clnF-w]