Jump to the best example here for Gradle and Maven
Problem
Quite a lot of Java dependencies bring Junit 4 or Junit vintage engine as a transitive dependency.
As well as Junit vintage engine is designed to integrate 4 and 5 version, it allows to use both at the same time. When you want to finally migrate, it leads to problems such as:
- Runtime issues: a junit4 class not found
- A test has run, but no coverage aggregated
- Not concise annotations usage
Solution
All these problems have only one proper solution:
Use one particular version of Junit to prevent misleading and misusage
Here I focus on the latest - Junit 5 version usage, hence, excluding of Junit 4.
One of the options is to ignore this dependency from a specific dependency:
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
But, it requires you to know which dependency brings unpleasant dependency for you. In this case, you can use this command to track:
./gradlew dependencyInsight --dependency "junit:junit" --configuration "testCompileClasspath"
Another option is to exclude not necessary dependencies from all the configurations. It leads you another problems such as: some library still requires Junit 4 / vintage. But, the compilation / runtime reflection errors actually only makes these dependencies visual and help to mark explicitly those Java modules, that still require on any reason to work with a legacy library.
Gradle:
Having configurations in Gradle it is easy to exclude a dependency in one particular place:
/* for all the configurations */
configurations {
all {
/* only junit 5 should be used */
exclude group: 'junit', module: 'junit'
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
/* for a particular test module */
configurations {
testCompile {
/* only junit 5 should be used */
exclude group: 'junit', module: 'junit'
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testRuntime {
/* only junit 5 should be used */
exclude group: 'junit', module: 'junit'
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
And don't forget to leave a comment for the future!
Resume
Hope this note helped to ignore unpleased dependency and keep control over your build configuration.
Top comments (0)