I’m trying to use a BOM across a group of projects and have run into the following issue:
In each project inside the dependencies I’m using:
dependencies {
implementation enforcedPlatform('my-bom:1.0')
...
}
This works as expected for base projects. But if I a have project that includes the platform and another project that already includes it i.e.
dependencies {
implementation enforcedPlatform('my-bom:1.0')
implementation('another-project-that-depends-on-the-bom:1.0')
...
}
I end up with a dependency resolution issue with the variants being incompatible between the current component using the bom as a platform and the consumer needed a library.
I.e.
Could not resolve all dependencies for configuration ':compileClasspath'.
> Could not resolve my-bom:1..0.
Required by:
project : > another-project-that-depends-on-the-bom:1.0
> No matching variant of my-bom:1.0 was found. The consumer was configured to find an API of a library compatible with Java 11, preferably in the form of class files, preferably optimized for standard JVMs, and its dependencies declared externally but:
- Variant 'apiElements' capability my-bom:1.0 declares an API of a component:
- Incompatible because this component declares a platform and the consumer needed a library
- Other compatible attributes:
- Doesn't say anything about how its dependencies are found (required its dependencies declared externally)
- Doesn't say anything about its target Java environment (preferred optimized for standard JVMs)
- Doesn't say anything about its target Java version (required compatibility with Java 11)
- Doesn't say anything about its elements (required them preferably in the form of class files)
I can workaround this by excluding the bom in the consumers i.e.
implementation('another-project-that-depends-on-the-bom:1.0') {
exclude module: 'my-bom:1.0'
}
But that’s cumbersome. Is there a way to do this more simply?