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]>
