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

Reply via email to