What does the specification say regarding the transitive? What does "earlier in the dependency tree" even mean for a library POM?
mode="selectionStrategy=highest skipper=versioned" I agree there should be a way for the end-users to enforce a version. However, I think Maven already has a way to do so. Users could configure <version>[1.0]</version>, which would have a clear meaning: there's a hard requirement on 1.0. The POM specification already allows that, and it describes [1.0] as a hard requirement. Note that it should be fine to have <version>[1.0]</version> in either top-level POM or in a transitive dependency. In other words, if one of the libraries wants to enforce a version, it could use [1.0] and be done with it. Then, the meaning of <version>[1.0]</version> would be the same no matter where user puts it. ----- <version>1.0</version> was always documented as a soft requirement, and I do not see reasons for the tag to have different meanings in different contexts (top-level POM vs all the other POMs). See https://www.oreilly.com/library/view/humane-interface-the/0201379376/0201379376_ch03lev1sec2.html >Jef Raskin, 2000, Humane Interface, The: New Directions for Designing Interactive Systems >Modes are a significant source of errors, confusion, unnecessary restrictions, and complexity in interfaces If we consider "root POM" to be special, then the same input (==same POM) would have different meaning depending the state (if the POM is root or not). What is the exact reason you want to have a special meaning for a "<version>1.0</version>" declared in a root POM? Frankly, I don't think "declared in the root" means "user wanted to enforce the version". What if user wants to enforce a version declared in one of the transitive modules? How would you specify the meaning of <version>1.0</version> in the POM specification if you want special root handling? Why should it behave differently from exactly the same declaration located elsewhere? Vladimir
