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


Reply via email to