To start the discussion for breaking up the modules into separate projects, I propose the following structure:
*logging-log4j* log4j-1.2-api log4j-api log4j-bom log4j-core log4j-core-its log4j-gctests log4j-iostreams log4j-layout-template-json log4j-perf log4j-plugins *logging-log4j-appender* log4j-cassandra log4j-couchdb log4j-csv log4j-flume-ng log4j-mongodb3 log4j-mongodb4 log4j-smtp *logging-log4j-appender-jdbc* log4j-jdbc (?) log4j-jdbc-dbcp2 (?) log4j-jpa *logging-log4j-appender-queue* log4j-jeromq log4j-jms log4j-kafka log4j-redis *logging-log4j-binding* log4j-jcl log4j-jpl log4j-jul log4j-liquibase log4j-slf4j18-impl log4j-slf4j-impl log4j-to-slf4j *logging-log4j-container* log4j-docker log4j-kubernetes *logging-log4j-gui* log4j-jmx-gui *logging-log4j-jee* log4j-appserver log4j-taglib log4j-web *logging-log4j-layout-jackson* log4j-layout-jackson log4j-layout-jackson-json log4j-layout-jackson-xml log4j-layout-jackson-yaml *logging-log4j-osgi* log4j-osgi *logging-log4j-spring* log4j-spring-boot log4j-spring-cloud-config Note that above breakdown contains every available module in master, except log4j-samples, which has the following sub-modules: log4j-samples-loggerProperties (contains 2 very trivial example classes, log4j-core [tests] contains more comprehensive alternatives) log4j-samples-flume-remote (flume-specific) log4j-samples-flume-embedded (flume-specific) log4j-samples-flume-common (flume-specific) log4j-samples-configuration (contains 3 very trivial example classes, log4j-core [tests] contains more comprehensive alternatives) I propose removing log4j-samples module and, if necessary, moving Flume-related parts to the log4j-flume-ng. I have kept log4j-layout-template-json in the logging-log4j project, since it has no external dependencies. This said, I am okay with moving it to a separate logging-log4j-layout project. Please share your remarks. Eventually, I want to translate this into a JIRA ticket. Kind regards. On Thu, Jun 10, 2021 at 5:43 PM Ralph Goers <ralph.go...@dslextreme.com> wrote: > Gary, > > I am -1 to almost every item on your list. > > When I said break up I meant mostly moving most everything outside of > log4j-core, > log4j-api, and log4j-plugins into separate repos such as > logging-log4j-nosql, > logging-log4j-pubsub, etc. These would not require groupId or artifactId > changes > although the versioning would potentially be out of synch with the main > releases > as each would be on its own release cycle. This would greatly simplify > releasing > core but it would require careful though on what the versions would be for > the > “extra” projects. > > As for further breaking up core, that should revolve primarily around > reducing the > dependencies listed in module-info.java to the bare minimum. > > There will be no log4j3. We cannot change groupIds, artifactIds, or > package names, > other than what has been done to support JPMS. A world in which a log4j2 > and > log4j3 try to co-exist would be an unmitigated disaster. Commons can > happily get > away with that. Log4j cannot. > > If an application had both log4j2 and log4j3 jars present they would end > up with > multiple LoggerContexts, multiple Configurations, and multiple Appender > Managers > where today there is only a single one. That would mean two instances of > the same > configuration file would be active at once. So when it is time to rollover > it would > be performed twice instead of once as a simple example. For this reason we > CANNOT break backward compatibility. > > However, we are talking about runtime backward compatibility. The Plugin > system > was changed internally in 3.0 so that plugins compiled with 3.0 use > ServiceLoader > instead of the data file. However, it will still find and use 2.x plugins > when they are > present and can be located. > > The meaning of this should be clear. It is 3.0 because to take advantage > of its > features you may have to make code changes. But it will tolerate code that > was > compiled for 2.x. > > The reasons why it is 3.0 and not a simple upgrade to 2.x are: > 1. Plugins must be compiled with 3.0 to use the ServiceLoader packaging. > 2. It requires Java 11. We still need to support Java 8. > 3. It fully supports JPMS. Release 2.x does not. It is likely that > applications with > multiple Module Layers might not be able to find all the plugins. Adding > full JPMS > support to 2.x simply isn’t possible. > 4. It will be introducing new DI injection features not present in 2.x. > > Major releases do not imply that you are completely breaking backward > compatibility. > They imply that some kind of compatibility is broken, which we are doing > by > requiring coding changes to Plugins to compile with 3.0. This means we > need to > leave in any classes or methods that existing plugins might have used. It > means > we have to continue using our own Supplier unless it can be verified that > an > application using the Supplier in 2.x can run with 3.0 even if it is > converted to > java.util.function.Supplier. I have no idea if the code the compiler > generates > for lambdas actually implements the declared interface or not. > > Log4j 3.0 is a major change. But that doesn’t mean we can screw our users > by > breaking everything. > > Ralph > > > > > On Jun 10, 2021, at 6:32 AM, Gary Gregory <garydgreg...@gmail.com> > wrote: > > > > These are all IMOs of course, YMMV: > > - What's the rush to 3.0? > > > > - I'm all for breaking up the core and other artifacts into more > > artifacts based on their dependencies requirement such that depending > > on Log4j 3 does not "suck in the world", for example, I should be able > > to depend on a currently non-existent "log4j3-console" and only bring > > in a tiny bit of code (API, a tiny core, and no plugin system). I did > > a fair amount of breaking up of various artifacts a while back. > > > > - 3.0 is a MAJOR release that gives us the opportunity to drop > > deprecated APIs and code like our custom functional interfaces: > > Supplier and so on. If we do not clean up, then there is no point in a > > major release. Basically, I expect to break binary and source > > compatibility. > > > > - 3.0 must be in a new package namespace and new Maven coordinates. I > > MUST be able to run Log4j 1, 2, and 3 in the same class loader. I can > > already run Log4j 1 and 2 side by side which is good. > > > > Gary > > > > On Thu, Jun 10, 2021 at 8:47 AM Volkan Yazıcı <volkan.yaz...@gmail.com> > wrote: > >> > >> Ralph, count me in for such a change. I really want to have separate > >> sub-projects for such modules. This will extremely speed up > build/release > >> times too, which is nowadays of uttermost importance to my peace of mind > >> while developing. > >> > >> This said, I am reluctant about such a major change when we are this > close > >> to the 3.0.0 release. I guess this would definitely postpone the 3.0.0 > >> release to 2022. This will probably break the backward compatibility at > >> least for the artifact groupId, am I wrong? Not to mention that the > entire > >> website needs to be adapted to this multi-project setup too. Is there > >> anything else? > >> > >> On Thu, Jun 3, 2021 at 5:31 PM Ralph Goers <ralph.go...@dslextreme.com> > >> wrote: > >> > >>> Yeah - I have proposed moving all these extra integrations to a > separate > >>> repo but > >>> I’ve never gotten consensus. I’d prefer to have a project like > >>> log4j-pubsub where > >>> things like JMS, JeroMQ, etc can go live, log4j-nosql for all the nosql > >>> modules, etc. > >>> The problem seems to be that some people believe that we would have to > cut > >>> a > >>> release of those every time we do a log4j release. > >>> > >>> If we were to do that 3.0 would be the right time. > >>> > > > > >