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