On 12/20/2024 11:18 AM, David Lloyd wrote:
I believe that the implication here would be that in addition to ensuring compatibility at a class/package level, the authors of the replacement (run time) artifact would have to be exceedingly careful to not depend on any new or different modules (compared to the original), else a cycle could be introduced at run time that didn't exist at compile time.

(I will continue to speak in terms of modules, because there's really no need to speak in terms of artifacts.)

There are certainly rules of substitutability that apply to the declaration of "replacement" modules (e.g., M @ 2.0 replacing M @ 1.0). One rule is not adding `requires` clauses, as you noted, since it could create a cycle in the overall graph. A more interesting rule, I think, is not adding `requires transitive` clauses, because they could cause a consumer module to experience a split package. And of course, not removing any `requires transitive` clauses, since they're the way that consumer modules gain access to Java APIs.

In the case of "replacement" modules for de jure standards like the {Java, Jakarta} EE Platform (c.f. javax.servlet-api), I would expect the social mores of the standards body to prevent an implementer from unhygienic behavior such as adding `requires transitive com.megacorp.proprietary.api;` to a replacement module.

In the case of "replacement" modules for de facto standards -- "log4j 1.x ... is a widely used library but with known security problems, so a replacement (e.g. reload4j) is provided instead" -- I would expect basic competence and conservatism from the developers of the "replacement" modules. If you're creating a "replacement" module for log4j, then the onus is on you to not cause problems when your module is resolved as part of a larger graph on the user's machine. The rules of hygiene for Java modules are just an extension of the well known binary compatibility rules for Java classes, methods, etc.

Alex

The `requires` of a module are therefore an implicit part of compatibility/substitutability even if consumers of that module are not directly aware of what they are. This can be challenging when the graph comprises modules from many third parties, which is very often the case, because every participant in the ecosystem has to agree to this rule to be 100% safe. Though I doubt 100% could be reached just because, to use your version example, introduction of new features may require other new third-party modules to realize them.

--
- DML • he/him

Reply via email to