Yup. I heard that. And my view is that if we do that none of us will be 
employable.

Ralph

> On May 12, 2022, at 9:34 AM, Gary Gregory <[email protected]> wrote:
> 
> My view is that 3.0 is the only time we can drop old code; that's exactly
> what a major version is for imo.
> 
> Gary
> 
> On Thu, May 12, 2022, 12:00 Chris Hegarty <[email protected]> wrote:
> 
>> Hi,
>> 
>> I want to pick up an old thread [1], for which I cannot find a
>> conclusion. Apologies if this has already been discussed, but I cannot
>> find it anywhere (and I have looked!).
>> 
>> It relates to the potential of dropping o.a.l.log4j.util.Supplier in
>> favour of the standard j.u.f.Supplier. I think that such is a great
>> idea, but I want to ensure that some details are not overlooked.
>> 
>> log4j.Supplier shows up in public API methods like, say,
>> Logger.info(Supplier<?>). If this, and others, were migrated to say,
>> Logger.info(util.Supplier<?>), then this would be a,
>> 
>>   - source compatible change, but a
>>   - binary incompatible change
>> 
>> Source compatible, since type inference will infer the similarly shaped
>> util.Supplier method variant when recompiling the consuming call sites
>> against the new method signature.
>> 
>> Binary incompatible, since existing classes compiled against the
>> existing info(log4j.Supplier) will have method descriptors in their byte
>> code referencing the log4j.Supplier signature variant, which will not be
>> resolvable at runtime.
>> 
>> For clarity, here is a brief, somewhat contrived, minimal example:
>> 
>> // Fake Logger interface
>> $ cat Logger.java
>> public interface Logger {
>>     void info(org.apache.logging.log4j.util.Supplier<?> messageSupplier);
>> }
>> 
>> // Fake LogManager: factory for loggers that log to stdout
>> $ cat LogManager.java
>> public class LogManager {
>>     public static Logger getLogger() {
>>         return new Logger() {
>>             @Override
>>             public void info(org.apache.logging.log4j.util.Supplier<?>
>> messageSupplier) {
>>                 System.out.println(messageSupplier.get());
>>             }
>>         };
>>     }
>> }
>> 
>> // Compile these
>> $ javac -cp log4j-api-2.17.1.jar Logger.java LogManager.java
>> 
>> 
>> // Minimal app that does some logging
>> $ cat Main.java
>> public class Main {
>>     public static void main(String... args) {
>>         LogManager.getLogger().info(() -> "log msg");
>>     }
>> }
>> 
>> $ javac -cp log4j-api-2.17.1.jar:. Main.java
>> $ java -cp log4j-api-2.17.1.jar:. Main
>> log msg
>> 
>> 
>> // Now migrate the logging framework to util.Supplier
>> 
>> $ cat Logger.java
>> public interface Logger {
>>     void info(java.util.function.Supplier<?> messageSupplier);
>> }
>> $ cat LogManager.java
>> public class LogManager {
>>     public static Logger getLogger() {
>>         return new Logger() {
>>             @Override
>>             public void info(java.util.function.Supplier<?>
>> messageSupplier) {
>>                 System.out.println(messageSupplier.get());
>>             }
>>         };
>>     }
>> }
>> 
>> // recompile the logging framework
>> $ javac Logger.java LogManager.java
>> 
>> // Now rerun the app code (without recompiling) - binary incompatible
>> 
>> $ java -cp log4j-api-2.17.1.jar:. Main
>> Exception in thread "main" java.lang.NoSuchMethodError: 'void
>> Logger.info(org.apache.logging.log4j.util.Supplier)'
>>        at Main.main(Main.java:4)
>> 
>> // Recompile the app code - source compatible
>> $ javac Main.java
>> $ java Main
>> log msg
>> 
>> -Chris.
>> 
>> [1] https://www.mail-archive.com/[email protected]/msg07967.html
>> 
>> 

Reply via email to