Excludes are used for a bunch of use cases, and I’d like to have solutions that describe why the dependency is not required. For example:
- Improving the declarative module history stuff (aka ‘replacements') to deal with modules splitting and merging over time.
- A way to declare that a given module provides some other module(s), so that conflict resolution can take this into account and exclude the conflicting modules. This would be used, for example, to model fat jars or modules that implement some API.
- A way to modify the meta-data of a module. The would be used, for example, to model the case where some dependency is declared by the module but not actually required, or more generally to tweak the dependencies of a module.
- A way to declare compatibility between various things, so that dependency resolution can select a better version of a module.
Having said that, some low level hooks would be useful. Currently, `DependencyResolveDetails` allows a single dependency edge to be replaced with some other edge. We could perhaps expand this to allow replacement with 0 or more edges.