getting Spring Boot [2.7.0] is not compatible with this Spring Cloud release train error - spring-boot

I am new to spring.
I was trying to upgrade spring boot version from 2.3.3.RELEASE to 2.6.7 in existing spring batch project.
Project build completed successfully but I am getting bellow error when I run batch. Please help.
***************************
APPLICATION FAILED TO START
***************************
Description:
Your project setup is incompatible with our requirements due to following reasons:
- Spring Boot [2.6.7] is not compatible with this Spring Cloud release train
Action:
Consider applying the following actions:
- Change Spring Boot version to one of the following versions [2.3.x, 2.4.x] .
You can find the latest Spring Boot versions here [https://spring.io/projects/spring-boot#learn].
If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section.
If you want to disable this check, just set the property [spring.cloud.compatibility-verifier.enabled=false]
My current code of build.gradle is as below,
buildscript {
ext {
springBootVersion = '2.6.7'
}
}
plugins {
id 'org.springframework.boot' version "${springBootVersion}"
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 11
tasks.named("bootJar") {
archiveFileName = "${archiveBaseName.get()}.${archiveExtension.get()}"
mainClass = 'jp.co.BatchApplication'
}
jar.archiveFileName = bootJar.archiveFileName
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-batch:${springBootVersion}")
implementation("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf:${springBootVersion}")
implementation("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}")
implementation("org.springframework.retry:spring-retry:1.2.5.RELEASE")
implementation("org.projectlombok:lombok:1.18.24")
annotationProcessor("org.projectlombok:lombok:1.18.24")
implementation('mysql:mysql-connector-java:8.0.17')
implementation('org.seasar.doma.boot:doma-spring-boot-starter:1.4.0')
annotationProcessor('org.seasar.doma:doma-processor:2.35.0')
implementation('org.apache.commons:commons-lang3:3.11')
implementation('org.apache.commons:commons-collections4:4.4')
implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.2')
implementation("javax.xml.bind:jaxb-api:2.3.1")
implementation(fileTree(dir: 'lib', include: ['*.jar']))
implementation("org.hibernate.validator:hibernate-validator:6.1.5.Final")
implementation('org.apache.httpcomponents:httpclient:4.5.12')
// for r3-id-1.0.1.jar
implementation('commons-digester:commons-digester:2.1')
// Azure App Configuration
implementation('com.microsoft.azure:spring-cloud-azure-appconfiguration-config-web:1.3.0')
implementation('com.microsoft.azure:spring-cloud-azure-feature-management-web:1.3.0')
testImplementation("org.springframework.boot:spring-boot-starter-test:${springBootVersion}")
}
*
*
*
*
I guess it is not relevant to this error but I have also change DefaultBatchConfigurer class from use of MapJobRepositoryFactoryBean to JobRepositoryFactoryBean. As MapJobRepositoryFactoryBean is deprecated.

The error is quite explanatory ...
- Spring Boot [2.6.7] is not compatible with this Spring Cloud release train
Spring Cloud versions are tied to specific Spring Boot versions. When using Spring Cloud you cannot just upgrade Spring Boot you also need to upgrade Spring Cloud to a version that supports that Spring Boot version.
As you are using some Azure Cloud dependencies you need to upgrade those to a newer version (if available) that support a Spring Cloud version that supports Spring Boot 2.6.
Pro Tip I would also suggest to cleanup your dependencies so you benefit, more, from the Spring Boot dependency management
dependencies {
implementation("org.springframework.boot:spring-boot-starter-batch")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-aop")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.retry:spring-retry")
implementation("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
implementation('mysql:mysql-connector-java')
implementation('org.seasar.doma.boot:doma-spring-boot-starter:1.4.0')
annotationProcessor('org.seasar.doma:doma-processor:2.35.0')
implementation('org.apache.commons:commons-lang3:3.11')
implementation('org.apache.commons:commons-collections4:4.4')
implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-xml')
implementation("javax.xml.bind:jaxb-api")
// for Mu Client
implementation(fileTree(dir: 'lib', include: ['*.jar']))
implementation('org.apache.httpcomponents:httpclient')
// for r3-id-3.0.1.jar
implementation('commons-digester:commons-digester:2.1')
// Azure App Configuration
implementation('com.microsoft.azure:spring-cloud-azure-appconfiguration-config-web:1.3.0')
implementation('com.microsoft.azure:spring-cloud-azure-feature-management-web:1.3.0')
testImplementation("org.springframework.boot:spring-boot-starter-test")
}

Related

How can I use Spring Cloud OpenFeign with Spring Boot 3.0.0-M4?

I want to use Spring Cloud OpenFeign with Spring Boot 3.0.0-M4 But I could not find the compatible version of Spring Cloud OpenFeign with spring boot 3.0.0-M4.
for using OpenFeign with this version of spring boot what should I do?
The new Spring Boot milestone version 3.0.0-M5 got released end of September.
You can use the corresponding Spring Cloud version 2022.0.0-M5 which includes Spring Cloud Openfeign 4.0.0-M5.
See https://spring.io/blog/2022/10/06/spring-cloud-2022-0-0-m5-is-now-available
(The same most probably works with M4 if you really have to use it)
However I would advise on using https://start.spring.io to generate your project stub and maven or gradle files that take care of selecting the correct versions for Spring Cloud modules like Openfeign.
Shortened example for build.gradle:
plugins {
id 'org.springframework.boot' version '3.0.0-M5'
id 'io.spring.dependency-management' version '1.0.14.RELEASE'
id 'java'
}
sourceCompatibility = '17'
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
ext {
set('springCloudVersion', "2022.0.0-M5")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}

tomcat-embed-core:10.1.0-M16 will make the import javax.servlet.http.HttpServletResponse cannot be resolve

If I put the latest org.apache.tomcat.embed:tomcat-embed-core:10.1.0-M16 dependecy, it will make the import javax.servlet.http.HttpServletResponse cannot be resolve.
Here's my build.gradle,
plugins {
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.apache.tomcat.embed:tomcat-embed-core:10.1.0-M16'
}
How do I fixed this?
Thank you!
tomcat-embed-core:9.0.63 provided by Spring Boot also contained repackaged classes from javax.servlet-api library, but they are no longer present in 10.1 branch due to migration from javax.servlet to jakarta.servlet. You could manually add this dependency to fix the compilation error:
compileOnly 'javax.servlet:javax.servlet-api:4.0.1'
However, this alone won't fix the issue, as Spring Boot 2.7 is just not internally compatible with Tomcat 10.1 because of its migration from javax.servlet to Jakarta APIs. If you want to try Tomcat 10.1 with Spring Boot, you'd most probably have to wait until Spring Boot 3 comes out. See more info in Spring Boot blog.

Usage of BootJar instead of BootRepackage in Gradle as part of Spring Boot Migration from 1..5.x to 2.x

I am working on Spring Boot migration from 1.5.12 to 2.1.14. We are using Gradle as a build tool, so as part of Spring Boot migration we had to change
Gradle from 3.x to 4.x and trying to update the build.gradle as required. In Spring Boot 2.x migration we have to change the following task in build.gradle
task msnServiceBoot(type: BootRepackage, dependsOn:msnJar) {
println " Executing MsnServiceBoot task"
mainClassName = 'com.msn.service.MsnApplication'
customConfiguration = "cloudconfigexclusion"
withJarTask = msnJar
}
In the above code we have to update BootRepackage to BootJar as per the latest Spring documentation.
The error, I'm getting after changing from BootRepackage to BootJar is customConfiguration is unknown property.
May I know how to make customConfiguration for Spring Boot 2.x with gradle 4.x

How to use spring boot in gradle without the spring boot gradle plugin

Can anyone show me or point me to a spring boot gradle project that does not make use of the spring boot gradle plugin.
I'm looking for something like a spring boot starter web hello world example that doesn't use the gradle plugin.
I can't imagine that the plugin is a requirement, but a search for examples all seem to lean on the gradle plugin, which lets just say is not an option in my environment, and no I can't switch to maven either.
Ideally the gradle build would work by adding something like the following:
gradle.properties
springBootVersion=2.1.3.RELEASE
build.gradle
dependencies {
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion
}
I used the spring dependency management plugin, and it works
buildscript {
ext {
springDepManagementVersion = '1.0.10.RELEASE'
springBootVersion = '2.6.6'
springCloudVersion = "2021.0.1"
}
dependencies {
classpath "io.spring.gradle:dependency-management-plugin:${springDepManagementVersion}"
}
}
apply plugin: 'io.spring.dependency-management'
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
}
}
dependencies {
implementation "org.springframework.cloud:spring-cloud-starter-sleuth"
implementation 'org.springframework.boot:spring-boot-starter-json'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-security'
...
}
I can't use spring boot gradle plugin, since I can only use gradle 6.7.1, while spring boot gradle plugin requires gradle version at least 6.8 to support spring boot 2.6. I was inspired by the spring cloud bom solution.

Why does Neo4j OGM with Spring Boot 2.0.0.M4 apparently require the embedded driver?

I have been trialling Spring Boot 2 (2.0.0.M4 at this stage) with the latest Spring Data Neo4j (currently 5.0.0.RC3) and can't seem to get it running.
I get the following error:
org.neo4j.ogm.exception.ConfigurationException: Could not load driver class org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver
I don't ask for an embedded driver, nor do I want one. I only want to use the bolt driver, which is already a dependency of spring-data-neo4j.
I've published a project to Github that was built using output from Spring Initializr that can be run to expose the error.
For reference, my build.gradle is as follows. Am I mis-configuring my project? Or is there something more serious wrong with the current Spring and Neo4j milestone builds?
buildscript {
ext {
springBootVersion = '2.0.0.M4'
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/snapshot' }
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
version = "0.0.1-SNAPSHOT"
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenLocal()
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile "org.apache.tomcat.embed:tomcat-embed-jasper"
compile "org.springframework.boot:spring-boot-starter-web"
compile "org.springframework.boot:spring-boot-starter-data-neo4j"
runtime "org.springframework.boot:spring-boot-devtools"
}
The rest of the code is available in Github as I mentioned earlier.
You don't have the embedded driver dependency anywhere, see
./gradlew dependencies
output and search for neo4j-ogm.*driver - only neo4j-ogm-bolt driver is present. So if you want to use bolt only you have the dependencies set up correctly.
The reason why you see this exception is because you configuration is wrong:
return new SessionFactory("com.example.domain");
This doesn't provide path to configuration file, the default then is impermanent embedded database, which needs the embedded driver - hence the exception.
You have two options
pass OGM configuration to SessionFactory:
#Bean
public org.neo4j.ogm.config.Configuration configuration() {
return new org.neo4j.ogm.config.Configuration.Builder(new ClasspathConfigurationSource("ogm.properties")).build();
}
#Bean
public SessionFactory sessionFactory() {
return new SessionFactory(configuration(), "com.example.domain");
}
beware that this is OGM only solution and doesn't support yml files.
use spring boot auto configuration for SDN - just delete the Neo4jConfiguration class, Spring Boot will detect there is no SessionFactory bean and will configure all required (including transaction manager). Keep your Application class and application.yml as it is.

Resources