What is a Gradle configuration?
In Maven dependencies can be assigned to a given scope:- compile – available on all classpaths and propagated to dependent projects
- provided – will be provided by your container
- runtime
- test
https://docs.gradle.org/current/userguide/declaring_dependencies.html
- Unlike in Maven, in Gradle it is easy to declare your own configurations.
- A configuration is a name which you can assign one or more files to.
- Configurations have producers, which assign files to them, and consumers, which use them.
Different configurations are defined in different plugins so if you try to use a configuration and get an error, confirm you have the plugin available in your module. e.g. https://docs.gradle.org/current/userguide/java_library_plugin.html
Common configurations:
Configuration | Description |
---|---|
api | Will be on compile classpath for this module, and for all subsequent modules |
implementation | Will be on compile classpath for this module, and runtime classpath for whole app, but NOT on compile classpath for later modules. This prevents developers from accidentally coding against a library that is used internally in one module. |
compileOnly | |
runtimeOnly | |
testImplementation | |
testApi | |
testFixturesImplementation | Used when defining a test fixture. See Using test fixtures in Gradle and Maven |
testFixturesApi | |
testFixtures | When consuming a test from another module. See Using test fixtures in Gradle and Maven |
annotationProcessor | For annotation processing in the compile phase. |
Dependency resolution strategy and automatic dependency upgrading
Gradle performs optimistic dependency upgrading. This can cause confusion because you may have a version of a dependency explicitly specified, but if a transitive dependency is a higher version, Gradle will take the higher version. This is not what Maven would do – it would always take the explicitly specified version.However in Gradle you can override the default dependency resolution strategy. There are multiple ways to do this:
Global fail if any conflict
configurations.all { resolutionStrategy { failOnVersionConflict() } }
Custom resolution
e.g. fix versionconfigurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'io.projectreactor' && details.requested.name == 'reactor-core' && details.requested.version == '3.3.0.M1') { details.useVersion '3.2.10.RELEASE' details.because 'the original version which comes with spring-integration:5.2.0.M2 is no longer available' }See: https://docs.gradle.org/current/userguide/resolution_strategy_tuning.html