I think I brought this topic up like 3 years ago when I was working on
initial OSGi support, but now that we have 3 more years worth of code
additions and optional features, I think this might be a more appropriate
time to discuss it again in light of experience.

Building log4j-core itself already takes a long time, and many plugins
aren't updated very often at all. In the past, requiring users to simply
add log4j-core plus any transitive dependencies to use optional features
seemed to work well enough, but I still think that's a confusing
distribution mechanism as demonstrated by the numerous bug reports and
Stack Overflow posts regarding missing transitive dependencies for various
features. I spent some time experimenting with Log4j Boot a little while
ago to help alleviate this problem, but this may be unnecessary if we can
agree to modularize log4j-core itself.

I have two different proposals, both of which can be used at the same time.

1. Split out everything from log4j-core that requires 3rd party
dependencies (except for AsyncLogger, though perhaps we could consider
shading and renaming those classes like some other low level libraries do
with JCTools). Ideally, I'd like to see each module have required
dependencies instead of optional ones, so that if, for instance, I include
a "log4j-config-yaml" dependency, I know that Log4j will support YAML
configuration without having to specify the individual Jackson dependencies.

2. Split out from log4j-core a sort of log4j-spi module which defines
interfaces, abstract classes, and annotations for plugins that would be
promoted to the same level of backwards compatibility guarantees as
log4j-api. This would aid in cementing what we really wish to maintain
compatibility with in the backend while allowing other modules to have less
strict guarantees.

With proposal #1, I'd think that we could more easily start moving modules
into separate repositories and release trains. Without #2, though, this
makes version support more annoying to handle, but that's what we'll face
regardless as we separate more repositories. If we go this route, then
there will be no need for a Log4j Boot subproject.

What do you all think?

-- 
Matt Sicker <[email protected]>

Reply via email to