Could somebody help me to understand what we mean by JPMS support, please?
Because I have the impression that people think `2.x` does not have JPMS
support and `main` excels at it.

`2.21.0` brought `2.x` a fully-fledged JPMS support. JPMS and OSGi
descriptors are auto-generated by `bnd-maven-plugin`. Piotr and I manually
marked every single package that needs to be exported and checked every
single generated `module-info.java` and `MANIFEST.MF`. IIRC, 3+ users
shared positive feedback in GitHub Issues and the next `2.x` release will
even support `jlink` due to #1896. Since there are no `module-info.java`
files lying around (`bnd-maven-plugin` adds them to the JAR at the
`package` phase), IDEs are not confused by the module-vs-class path dilemma
too.

OTOH, JPMS support in the `main` branch was first established by
hand-written `module-info.java` files and then later on reimplemented (work
in progress!) by Piotr via porting stuff from `2.x`. Nobody has tested it
yet, AFAIK. `jlink` is known to not work there.

In the context of JPMS support, `2.x` is a clear winner over `3.x`, AFAIC.
If not, I would appreciate your help in explaining what I am missing.

Though `3.x` is good at two things regarding modularization:

   1. It breaks down `log4j-core` into more fine-grained modules (e.g.,
   `log4j-csv`)
   2. It has slightly improved package encapsulation. That is, some
   internal classes are indeed moved to internal packages.

`2.x` can never implement #2, since it is a breaking change. Thought #1 can
very well be implemented for `2.x` – users will just need to add a new JAR
to their classpath.

Reply via email to