On 2/7/2024 6:14 AM, Piotr P. Karwasz wrote:
If a user declares `log4j-core` as compile dependency and adds
`requires org.apache.logging.log4j.core` to their module descriptor,
the `requires static transitive` directives will cause compilation
errors, since the minimal compilation time resolution requires all
transitive dependencies of direct dependencies. That is why we
manually remove the `transitive` keyword from those dependencies.
By "minimal compile time resolution", are you referring to something
that Maven does? If so, and you're reasoning about how `requires static
transitive` would be interpreted, then be aware that the term
"transitive" means different things in the Maven world and the Java
module world. Ultimately it's about indirect dependencies in both
worlds, but in Maven a "transitive dependency" is one level further
_down_ from the depending artifact, while in Java modules, saying
`requires transitive` makes the requiring module itself an indirect
dependency (of a module one level further _up_).
Would it be wiser not to export packages that depend on optional
dependencies?
Yes.
The right way to encode optional dependencies is in the programming
model: by programming to an interface for which ServiceLoader finds
implementations; if there are zero implementations, then the program
will find this out and can deal with it.
Alex