Spring Boot/Gradle/Querydsl project has the same dependency dependent on different versions of another dependency - spring-boot

I am having problems adding Querydsl to my Spring Boot project. I have the following dependencies in my build.gradle file:
dependencies {
annotationProcessor 'com.querydsl:querydsl-apt:4.1.3:jpa'
annotationProcessor 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.querydsl:querydsl-jpa:4.1.3'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.3.RELEASE'
implementation 'org.springframework.cloud:spring-cloud-config-client:2.1.0.RELEASE'
implementation 'mysql:mysql-connector-java'
implementation 'io.springfox:springfox-swagger2:2.9.2'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
implementation 'io.springfox:springfox-bean-validators:2.9.2'
implementation group: 'org.latencyutils', name: 'LatencyUtils', version: '2.0.3'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-inline:2.23.4'
}
The project builds fine, but when I run it, I get the following error:
An attempt was made to call the method com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable; but it does not exist. Its class, com.google.common.collect.FluentIterable, is available from the following locations:
jar:file:/C:/Users/me/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/18.0/cce0823396aa693798f8882e64213b1772032b09/guava-18.0.jar!/com/google/common/collect/FluentIterable.class
jar:file:/C:/Users/me/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/20.0/89507701249388e1ed5ddcf8c41f4ce1be7831ef/guava-20.0.jar!/com/google/common/collect/FluentIterable.class
It was loaded from the following location:
file:/C:/Users/me/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/18.0/cce0823396aa693798f8882e64213b1772032b09/guava-18.0.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of com.google.common.collect.FluentIterable
The Gradle window in IntelliJ shows the following:
Why does each instance of com.querydsl:querydsl-core:4.2.1 depend on a different version of guava?

The version 18.0 of Guava comes from querydsl and the 20.0 comes from spring-fox swagger.
spring-fox library expected that method of guava version 20.0 to be called. but called from 18.0. (because there are two guava library that has difference version in classpath)
you can use the following code to avoid conflict version of guava.
// QueryDsl
implementation("com.querydsl:querydsl-jpa:${querydslVersion}")
annotationProcessor("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final")
annotationProcessor("com.querydsl:querydsl-apt:${querydslVersion}:jpa") {
exclude group: "come.google.guava"
}
annotationProcessor("com.google.guava:guava:20.0")

Related

Spring boot gradle dependencies managment

I have the following gradle settings:
plugins {
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-aop'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-amqp'
testImplementation 'org.springframework.amqp:spring-rabbit-test'
}
How can I lock or specify exactly the versions of all the dependencies libs, how do I check the compatibility with the other libs and chose the most new and updated ones?
as I understand - spring boot doesn't need spring framework specified?
checked other Stackoverflow posts.
checked compatibility matrix.
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:3.0.0"
}
}
solved the issue.

QueryDSL annotation processor - jpa classifier no longer works

My annotation processing has suddenly stopped working. I've made no known changes to my configuration and haven't been able to find any references to the error I'm getting.
Gradle Version: 7.5.1
QueryDSL Version: 5.0.0
build.gradle:
implementation "com.querydsl:querydsl-core:${querydslVersion}"
implementation "com.querydsl:querydsl-jpa:${querydslVersion}"
implementation "com.querydsl:querydsl-apt:${querydslVersion}"
...
annotationProcessor ("javax.annotation:javax.annotation-api:1.3.2")
annotationProcessor ("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final")
annotationProcessor ("com.querydsl:querydsl-apt:${querydslVersion}")
annotationProcessor ("com.querydsl:querydsl-apt:${querydslVersion}:jpa")
Error:
* What went wrong:
Execution failed for task ':compileJava'.
> Could not resolve all files for configuration ':annotationProcessor'.
> Could not find querydsl-apt-5.0.0-jpa.jar (com.querydsl:querydsl-apt:5.0.0).
Searched in the following locations:
file:/Users/devuser/.m2/repository/com/querydsl/querydsl-apt/5.0.0/querydsl-apt-5.0.0-jpa.jar
Found a work around (9/24):
The version of querydsl-jpa is controlled by my JHipster BOM, which pulls in 5.0.0. But if I specify the 4.4.0 version in my annotation processor it works. So it seems like the behavior changed in 5.0.0, or the classifier needs to be specified in some other way. But this is how I got it to work again.
implementation group: 'com.querydsl', name:'querydsl-jpa', version:'+'
annotationProcessor group: 'com.querydsl', name: 'querydsl-apt', classifier: 'jpa', version: '4.4.0'

Spring Web projects multi module

Regarding modern multi-module constructions.
Can many Spring Web projects be imported into one another?
- Project 1 ==> have some endpoints
- Project 2 ==> have some other
endpoints
I tried, but only Project 1's endpoints are exposed.
and the other project 2 endpoints provide the following error
The origin server did not find a current representation for the target resource or is not
willing to disclose that one exists.
project 1 dependencies
api 'org.springframework.boot:spring-boot-starter-security'
api 'org.springframework.boot:spring-boot-starter-actuator'
api("io.springfox:springfox-swagger2:3.0.0") {
exclude module: "mapstruct"
}
compileOnly 'javax.servlet:servlet-api:2.5'
api 'javax.persistence:javax.persistence-api:2.2'
api 'org.springframework.boot:spring-boot-starter-data-jpa'
api 'com.cmeza:spring-data-generator:1.1.9'
api 'org.springframework.boot:spring-boot-starter-web'
api 'com.slack.api:slack-api-client:1.24.0'
api 'com.google.guava:guava:31.1-jre'
api 'io.jsonwebtoken:jjwt:0.9.1'
api 'org.apache.commons:commons-lang3:3.12.0'
api 'javax.validation:validation-api:2.0.1.Final'
api 'io.jsonwebtoken:jjwt:0.9.1'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
project 2 dependencies
implementation project(":project1")
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.cmeza:spring-data-generator:1.1.9'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation('javax.xml.bind:jaxb-api:2.3.1')
implementation('org.javassist:javassist:3.23.1-GA')
implementation 'org.mapstruct:mapstruct:1.5.2.Final'
implementation 'com.opencsv:opencsv:5.6'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'
I was expecting this will include project 2 packages as it's the main runner
#ComponentScan(basePackages="project1.*")
but, regrettably, it doesn't.
so it should be
#ComponentScan(basePackages="project1.*","project2.*")

gradle build failed due to dependency lock state

i have newly added a below dependency into my project
implementation 'org.jdbi:jdbi3-oracle12:3.29.0'
these are the dependencies which i already have in my project.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.data:spring-data-jpa'
implementation 'org.hibernate:hibernate-core'
// Oracle JDBC drivers
implementation("com.oracle.database.jdbc:ojdbc11")
implementation("com.oracle.database.jdbc:ucp")
// Additional Jars for using Oracle Wallets
implementation("com.oracle.database.security:oraclepki")
implementation("com.oracle.database.security:osdt_core")
implementation("com.oracle.database.security:osdt_cert")
implementation 'org.apache.commons:commons-lang3:3.12.0'
implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'org.jdbi:jdbi3-core:3.28.0'
implementation 'org.jdbi:jdbi3-oracle12:3.29.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mockito:mockito-inline:4.5.1'
}
while adding the new dependency and doing gradle build. i'm getting the below error. can some one guide me how to fix this?
Execution failed for task ':compileJava'.
Could not resolve all files for configuration ':compileClasspath'.
Resolved 'org.jdbi:jdbi3-oracle12:3.29.0' which is not part of the dependency lock state
Resolved 'com.oracle.database.jdbc:ojdbc8:21.3.0.0' which is not part of the dependency lock state

TestEngine with ID 'junit-vintage' failed to discover tests - JUnitException: Failed to parse version of junit:junit: 4.13.2

I'm having a very weird issue with my Gradle config and JUnit, I have tried updating to 5.7+ but I'm getting the following exceptions:
org/junit/jupiter/api/extension/ScriptEvaluationException
java.lang.NoClassDefFoundError: org/junit/jupiter/api/extension/ScriptEvaluationException
My Gradle version is 6.8.3 by the way. On the other hand, Here is the exception that I got with the current config below, I have tried a lot of combinations of versions and libraries, hut seems that none of them work:
Caused by: org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-vintage' failed to discover tests
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:111)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:85)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:92)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
... 25 more
Caused by: org.junit.platform.commons.JUnitException: Failed to parse version of junit:junit: 4.13.2
at org.junit.vintage.engine.JUnit4VersionCheck.parseVersion(JUnit4VersionCheck.java:54)
at org.junit.vintage.engine.JUnit4VersionCheck.checkSupported(JUnit4VersionCheck.java:37)
at org.junit.vintage.engine.JUnit4VersionCheck.checkSupported(JUnit4VersionCheck.java:32)
at org.junit.vintage.engine.VintageTestEngine.discover(VintageTestEngine.java:62)
plugins {
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'com.palantir.docker' version '0.26.0'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
docker {
name "{project.name}"
dockerfile file('src/docker/Dockerfile')
copySpec.from( jar ).rename(".*", "crm_lead_validator.jar")
buildArgs( ['JAR_FILE':"crm_lead_validator.jar"] )
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.jeasy:easy-random-core:5.0.0'
implementation 'io.github.openfeign:feign-jackson:9.3.1'
implementation 'com.github.tomakehurst:wiremock:2.25.1'
implementation 'org.mock-server:mockserver-netty:3.10.8'
implementation 'org.mock-server:mockserver-client-java:3.10.8'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.12.3'
implementation 'com.fasterxml.jackson.core:jackson-core:2.12.3'
implementation 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
implementation 'io.github.openfeign:feign-okhttp:10.11'
implementation 'io.github.openfeign:feign-slf4j:10.11'
implementation 'io.github.openfeign:feign-gson:10.11'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
// https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher
testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.7.2'
testImplementation "org.junit.jupiter:junit-jupiter-engine:5.6.2"
testImplementation "org.junit.vintage:junit-vintage-engine:5.6.2"
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.6.2'
}
test {
useJUnitPlatform()
}
Does anyone know how to make it work?
Thank you for your help.
Due to a bug in JUnit, junit-vintage-engine:5.6.2 did not support JUnit 4.13.2. It only supported 4.12 or 4.13. So that's why you see that exception.
That bug was fixed in JUnit 5.6.3. See https://github.com/junit-team/junit5/issues/2198 for details.
You are also mixing versions of JUnit 5 artifacts, which you should try to avoid. For example, if you want to use JUnit Platform 1.7.2, I would advise that you use JUnit Jupiter 5.7.2 and JUnit Vintage 5.7.2.
For details on how to correctly configure the JUnit versions with Spring Boot, see
Gradle 5 JUnit BOM and Spring Boot Incorrect Versions.
I was having this error too.
In my idea project file I had 2 versions of junit dependencies declared, 5.4.2 and 4.13.2.
getting rid of 4.13.2 fixes the issue for me.
I solved this problem by adding the dependency as suggested by the spring documentation:
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
Reference doc: Spring-Boot 7.8 - Test

Resources