Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SLF4J-579 Export both org.slf4j and org.slf4j.helper in version 1.8 #358

Closed
wants to merge 1 commit into from

Conversation

kwin
Copy link

@kwin kwin commented Oct 6, 2023

additionally to the default 2.x versions

Enable baselining against latest 1.7.36 version to enforce correct semantic versioning

additionally to the default 2.x versions

Enable baselining against latest 1.7.36 version to enforce correct
semantic versioning

Signed-off-by: Konrad Windszus <kwin@apache.org>
@kwin
Copy link
Author

kwin commented Oct 6, 2023

Relates to #331

Copy link
Contributor

@HannesWell HannesWell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this.
Especially using the baseline plugin should help to ensure backwards compatibility in the future.

With the baseline 1.7.36 currently configured the baseline plugin says that there was a breaking change up until 2.0.10.
Can you tell where this happened? I somehow fail to read that from the print-out.

[INFO] > org.slf4j.helpers                                  major      2.0.10     1.7.36     2.0.0      Excessive version increase
[INFO]      + class org.slf4j.helpers.AbstractLogger
[INFO]          + access abstract
[INFO]          + implements java.io.Serializable
[INFO]          + implements org.slf4j.Logger
[INFO]          + field name
[INFO]              + access protected
[INFO]              + return java.lang.String
[INFO]          + method <init>()
[INFO]              + return void
[INFO]          + method atDebug()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atError()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atInfo()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atLevel(org.slf4j.event.Level)
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atTrace()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atWarn()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method clone()
[INFO]              + access protected
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return java.lang.Object
[INFO]          + method debug(java.lang.String)
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method equals(java.lang.Object)
[INFO]              + return boolean
[INFO]          + method error(java.lang.String)
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method finalize()
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method getFullyQualifiedCallerName()
[INFO]              + access abstract
[INFO]              + access protected
[INFO]              + return java.lang.String
[INFO]          + method getName()
[INFO]              + return java.lang.String
[INFO]          + method handleNormalizedLoggingCall(org.slf4j.event.Level,org.slf4j.Marker,java.lang.String,java.lang.Object[],java.lang.Throwable)
[INFO]              + access abstract
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method hashCode()
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return int
[INFO]          + method info(java.lang.String)
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method isDebugEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isDebugEnabled(org.slf4j.Marker)
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isEnabledForLevel(org.slf4j.event.Level)
[INFO]              + return boolean
[INFO]          + method isErrorEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isErrorEnabled(org.slf4j.Marker)
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isInfoEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isInfoEnabled(org.slf4j.Marker)
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isTraceEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isTraceEnabled(org.slf4j.Marker)
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isWarnEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isWarnEnabled(org.slf4j.Marker)
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method makeLoggingEventBuilder(org.slf4j.event.Level)
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method readResolve()
[INFO]              + access protected
[INFO]              + return java.lang.Object
[INFO]          + method toString()
[INFO]              + return java.lang.String
[INFO]          + method trace(java.lang.String)
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method warn(java.lang.String)
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]      < class org.slf4j.helpers.BasicMDCAdapter
[INFO]          + method clearDequeByKey(java.lang.String)
[INFO]              + return void
[INFO]          + method getCopyOfDequeByKey(java.lang.String)
[INFO]              + return java.util.Deque
[INFO]          + method popByKey(java.lang.String)
[INFO]              + return java.lang.String
[INFO]          + method pushByKey(java.lang.String,java.lang.String)
[INFO]              + return void
[INFO]      + class org.slf4j.helpers.LegacyAbstractLogger
[INFO]          + access abstract
[INFO]          + extends org.slf4j.helpers.AbstractLogger
[INFO]          + implements java.io.Serializable
[INFO]          + implements org.slf4j.Logger
[INFO]          + field name
[INFO]              + access protected
[INFO]              + return java.lang.String
[INFO]          + method <init>()
[INFO]              + return void
[INFO]          + method atDebug()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atError()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atInfo()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atLevel(org.slf4j.event.Level)
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atTrace()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atWarn()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method clone()
[INFO]              + access protected
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return java.lang.Object
[INFO]          + method debug(java.lang.String)
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method debug(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method debug(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method equals(java.lang.Object)
[INFO]              + return boolean
[INFO]          + method error(java.lang.String)
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method error(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method error(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method finalize()
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method getFullyQualifiedCallerName()
[INFO]              + access abstract
[INFO]              + access protected
[INFO]              + return java.lang.String
[INFO]          + method getName()
[INFO]              + return java.lang.String
[INFO]          + method handleNormalizedLoggingCall(org.slf4j.event.Level,org.slf4j.Marker,java.lang.String,java.lang.Object[],java.lang.Throwable)
[INFO]              + access abstract
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method hashCode()
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return int
[INFO]          + method info(java.lang.String)
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method info(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method info(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method isDebugEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isDebugEnabled(org.slf4j.Marker)
[INFO]              + return boolean
[INFO]          + method isEnabledForLevel(org.slf4j.event.Level)
[INFO]              + return boolean
[INFO]          + method isErrorEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isErrorEnabled(org.slf4j.Marker)
[INFO]              + return boolean
[INFO]          + method isInfoEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isInfoEnabled(org.slf4j.Marker)
[INFO]              + return boolean
[INFO]          + method isTraceEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isTraceEnabled(org.slf4j.Marker)
[INFO]              + return boolean
[INFO]          + method isWarnEnabled()
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method isWarnEnabled(org.slf4j.Marker)
[INFO]              + return boolean
[INFO]          + method makeLoggingEventBuilder(org.slf4j.event.Level)
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method readResolve()
[INFO]              + access protected
[INFO]              + return java.lang.Object
[INFO]          + method toString()
[INFO]              + return java.lang.String
[INFO]          + method trace(java.lang.String)
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method trace(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method trace(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method warn(java.lang.String)
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method warn(java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method warn(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + return void
[INFO]      < class org.slf4j.helpers.MarkerIgnoringBase
[INFO]          + method atDebug()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atError()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atInfo()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atLevel(org.slf4j.event.Level)
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atTrace()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atWarn()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method isEnabledForLevel(org.slf4j.event.Level)
[INFO]              + return boolean
[INFO]          + method makeLoggingEventBuilder(org.slf4j.event.Level)
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]      < class org.slf4j.helpers.MessageFormatter
[INFO]          + method basicArrayFormat(java.lang.String,java.lang.Object[])
[INFO]              + access static
[INFO]              + return java.lang.String
[INFO]          + method basicArrayFormat(org.slf4j.helpers.NormalizedParameters)
[INFO]              + access static
[INFO]              + return java.lang.String
[INFO]      > class org.slf4j.helpers.NOPLogger
[INFO]          - extends org.slf4j.helpers.MarkerIgnoringBase
[INFO]          + method atDebug()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atError()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atInfo()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atLevel(org.slf4j.event.Level)
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atTrace()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atWarn()
[INFO]              + annotated org.slf4j.helpers.CheckReturnValue
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          > method debug(org.slf4j.Marker,java.lang.String)
[INFO]              + access final
[INFO]          > method debug(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + access final
[INFO]          > method debug(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + access final
[INFO]          > method debug(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + access final
[INFO]          > method debug(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + access final
[INFO]          > method error(org.slf4j.Marker,java.lang.String)
[INFO]              + access final
[INFO]          > method error(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + access final
[INFO]          > method error(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + access final
[INFO]          > method error(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + access final
[INFO]          > method error(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + access final
[INFO]          > method info(org.slf4j.Marker,java.lang.String)
[INFO]              + access final
[INFO]          > method info(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + access final
[INFO]          > method info(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + access final
[INFO]          > method info(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + access final
[INFO]          > method info(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + access final
[INFO]          > method isDebugEnabled(org.slf4j.Marker)
[INFO]              + access final
[INFO]          + method isEnabledForLevel(org.slf4j.event.Level)
[INFO]              + return boolean
[INFO]          > method isErrorEnabled(org.slf4j.Marker)
[INFO]              + access final
[INFO]          > method isTraceEnabled(org.slf4j.Marker)
[INFO]              + access final
[INFO]          > method isWarnEnabled(org.slf4j.Marker)
[INFO]              + access final
[INFO]          + method makeLoggingEventBuilder(org.slf4j.event.Level)
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          > method trace(org.slf4j.Marker,java.lang.String)
[INFO]              + access final
[INFO]          > method trace(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + access final
[INFO]          > method trace(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + access final
[INFO]          > method trace(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + access final
[INFO]          > method trace(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + access final
[INFO]          > method warn(org.slf4j.Marker,java.lang.String)
[INFO]              + access final
[INFO]          > method warn(org.slf4j.Marker,java.lang.String,java.lang.Object)
[INFO]              + access final
[INFO]          > method warn(org.slf4j.Marker,java.lang.String,java.lang.Object,java.lang.Object)
[INFO]              + access final
[INFO]          > method warn(org.slf4j.Marker,java.lang.String,java.lang.Object[])
[INFO]              + access final
[INFO]          > method warn(org.slf4j.Marker,java.lang.String,java.lang.Throwable)
[INFO]              + access final
[INFO]      < class org.slf4j.helpers.NOPMDCAdapter
[INFO]          + method clearDequeByKey(java.lang.String)
[INFO]              + return void
[INFO]          + method getCopyOfDequeByKey(java.lang.String)
[INFO]              + return java.util.Deque
[INFO]          + method popByKey(java.lang.String)
[INFO]              + return java.lang.String
[INFO]          + method pushByKey(java.lang.String,java.lang.String)
[INFO]              + return void
[INFO]      + class org.slf4j.helpers.NOP_FallbackServiceProvider
[INFO]          + implements org.slf4j.spi.SLF4JServiceProvider
[INFO]          + field REQUESTED_API_VERSION
[INFO]              + access static
[INFO]              + return java.lang.String
[INFO]          + method <init>()
[INFO]              + return void
[INFO]          + method clone()
[INFO]              + access protected
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return java.lang.Object
[INFO]          + method equals(java.lang.Object)
[INFO]              + return boolean
[INFO]          + method finalize()
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method getLoggerFactory()
[INFO]              + return org.slf4j.ILoggerFactory
[INFO]          + method getMDCAdapter()
[INFO]              + return org.slf4j.spi.MDCAdapter
[INFO]          + method getMarkerFactory()
[INFO]              + return org.slf4j.IMarkerFactory
[INFO]          + method getRequestedApiVersion()
[INFO]              + return java.lang.String
[INFO]          + method hashCode()
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return int
[INFO]          + method initialize()
[INFO]              + return void
[INFO]          + method toString()
[INFO]              + return java.lang.String
[INFO]      + class org.slf4j.helpers.NormalizedParameters
[INFO]          + method <init>(java.lang.String,java.lang.Object[])
[INFO]              + return void
[INFO]          + method <init>(java.lang.String,java.lang.Object[],java.lang.Throwable)
[INFO]              + return void
[INFO]          + method clone()
[INFO]              + access protected
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return java.lang.Object
[INFO]          + method equals(java.lang.Object)
[INFO]              + return boolean
[INFO]          + method finalize()
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method getArguments()
[INFO]              + return java.lang.Object[]
[INFO]          + method getMessage()
[INFO]              + return java.lang.String
[INFO]          + method getThrowable()
[INFO]              + return java.lang.Throwable
[INFO]          + method getThrowableCandidate(java.lang.Object[])
[INFO]              + access static
[INFO]              + return java.lang.Throwable
[INFO]          + method hashCode()
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return int
[INFO]          + method normalize(java.lang.String,java.lang.Object[],java.lang.Throwable)
[INFO]              + access static
[INFO]              + return org.slf4j.helpers.NormalizedParameters
[INFO]          + method normalize(org.slf4j.event.LoggingEvent)
[INFO]              + access static
[INFO]              + return org.slf4j.helpers.NormalizedParameters
[INFO]          + method toString()
[INFO]              + return java.lang.String
[INFO]          + method trimmedCopy(java.lang.Object[])
[INFO]              + access static
[INFO]              + return java.lang.Object[]
[INFO]      < class org.slf4j.helpers.SubstituteLogger
[INFO]          + field createdPostInitialization
[INFO]              + access final
[INFO]              + return boolean
[INFO]          + method atDebug()
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atError()
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atInfo()
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atLevel(org.slf4j.event.Level)
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atTrace()
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method atWarn()
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]          + method delegate()
[INFO]              + return org.slf4j.Logger
[INFO]          + method isEnabledForLevel(org.slf4j.event.Level)
[INFO]              + return boolean
[INFO]          + method makeLoggingEventBuilder(org.slf4j.event.Level)
[INFO]              + return org.slf4j.spi.LoggingEventBuilder
[INFO]      + class org.slf4j.helpers.SubstituteServiceProvider
[INFO]          + implements org.slf4j.spi.SLF4JServiceProvider
[INFO]          + method <init>()
[INFO]              + return void
[INFO]          + method clone()
[INFO]              + access protected
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return java.lang.Object
[INFO]          + method equals(java.lang.Object)
[INFO]              + return boolean
[INFO]          + method finalize()
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method getLoggerFactory()
[INFO]              + return org.slf4j.ILoggerFactory
[INFO]          + method getMDCAdapter()
[INFO]              + return org.slf4j.spi.MDCAdapter
[INFO]          + method getMarkerFactory()
[INFO]              + return org.slf4j.IMarkerFactory
[INFO]          + method getRequestedApiVersion()
[INFO]              + return java.lang.String
[INFO]          + method getSubstituteLoggerFactory()
[INFO]              + return org.slf4j.helpers.SubstituteLoggerFactory
[INFO]          + method hashCode()
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return int
[INFO]          + method initialize()
[INFO]              + return void
[INFO]          + method toString()
[INFO]              + return java.lang.String
[INFO]      + class org.slf4j.helpers.ThreadLocalMapOfStacks
[INFO]          + method <init>()
[INFO]              + return void
[INFO]          + method clearDequeByKey(java.lang.String)
[INFO]              + return void
[INFO]          + method clone()
[INFO]              + access protected
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return java.lang.Object
[INFO]          + method equals(java.lang.Object)
[INFO]              + return boolean
[INFO]          + method finalize()
[INFO]              + access protected
[INFO]              + return void
[INFO]          + method getCopyOfDequeByKey(java.lang.String)
[INFO]              + return java.util.Deque
[INFO]          + method hashCode()
[INFO]              + annotated jdk.internal.vm.annotation.IntrinsicCandidate
[INFO]              + return int
[INFO]          + method popByKey(java.lang.String)
[INFO]              + return java.lang.String
[INFO]          + method pushByKey(java.lang.String,java.lang.String)
[INFO]              + return void
[INFO]          + method toString()
[INFO]              + return java.lang.String
[INFO]      + annotation org.slf4j.helpers.CheckReturnValue
[INFO]          + access abstract
[INFO]          + implements java.lang.annotation.Annotation
[INFO]          + method annotationType()
[INFO]              + access abstract
[INFO]              + return java.lang.Class
[INFO]          + method equals(java.lang.Object)
[INFO]              + access abstract
[INFO]              + return boolean
[INFO]          + method hashCode()
[INFO]              + access abstract
[INFO]              + return int
[INFO]          + method toString()
[INFO]              + access abstract
[INFO]              + return java.lang.String
[INFO]          + annotated java.lang.annotation.Documented
[INFO]          + annotated java.lang.annotation.Retention
[INFO]              + property value='RUNTIME'
[INFO]          + annotated java.lang.annotation.Target
[INFO]              + property value.0='METHOD'
[INFO]      - version 1.7.36
[INFO]      + version 2.0.10

@@ -28,7 +28,8 @@
<properties>
<!-- yyyy-MM-dd'T'HH:mm:ss'Z' -->
<project.build.outputTimestamp>2023-09-03T16:20:19Z</project.build.outputTimestamp>
<latest.1.version>1.7.36</latest.1.version>
<!-- package version being backwards compatible with SLF4J 1.x OSGi consumers -->
<backwards.compatible.version>1.8.0</backwards.compatible.version>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain why you choose 1.8.0?
Did you do it because of the SemVer rules to increase the minor version if API is added?
@ceki could it happen that there will be a 1.8 version of slf4j one day?
If yes, I suggest to use something very high, e.g. 1.99 so that the package from slf4j-api 2 is always higher tan a package exported from a potential future slf4j-1.X release.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I incremented the minor version against the 1.7.36 release because that is what https://docs.osgi.org/whitepaper/semantic-versioning/ recommends. In this case the following applies:

minor — API consumers are compatible with exporters that have the same major number and an equal or higher minor version. API providers are compatible with exporters that have the same major and minor version number. For example, 1.2 is backward compatible with 1.1 for consumers but for providers it is incompatible. Consumers should therefore import [1.2,2) and providers should import [1.2,1.3).

In this case only new classes and new methods have been added but none removed or modified in a backwards incompatible way (that is what baselining proofs as well)

could it happen that there will be a 1.8 version of slf4j one day?

It should really be 1.7.37 (or other 1.7 versions only increasing the micro version) as according to https://www.slf4j.org/download.html

The older stable SLF4J version is 1.7.36. It is no longer actively developed.

To me this means, if at all bugfix release only with no changed API signatures!

<goal>baseline</goal>
</goals>
<configuration>
<comparisonVersion>1.7.36</comparisonVersion>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using 1.7.36 is good for the initial verification but eventually it should be the previous release to ensure there is no unintended future breakage.
With a 1.7 baseline checking is pointless since we had a major version bump compared to it, so everything is allowed.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, because only the 1.8 package versions are properly semantically versioned. The 2.x line isn't as there each package just inherits the bundle/project version. What matters is only that 1.8 is correctly semantically versioned against the last 1.x version. Introducing a check against the latest 2.x release would be orthogonal to this use case (and would only make sure that the 2.x package versions are also semantically correct which isn't the case yet)

*,\
org.slf4j;uses:="org.slf4j.event,org.slf4j.helpers,org.slf4j.spi";version="${latest.1.version}"
]]></_exportcontents>
org.slf4j;version="${backwards.compatible.version}",\
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since bndtools/bnd#5789 was closed should we add the uses constraints back?
But I haven't read Peter Kriens answer in full detail.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically it says, that the tool does not support emitting uses twice (automatically generated) but in this particular case they are not necessary either (as there won't be ever any other bundle exporting those packages from the uses directive). Therefore I removed the manually copied uses constraints.

@kwin
Copy link
Author

kwin commented Oct 7, 2023

Can you tell where this happened? I somehow fail to read that from the print-out.

Baselining just emits warnings (no errors). Those are emitted at the end of the report:

[WARNING] org.slf4j: Excessive version increase; detected 2.0.10, suggested 1.8.0
[WARNING] org.slf4j.event: Excessive version increase; detected 2.0.10, suggested 2.0.0
[WARNING] org.slf4j.helpers: Excessive version increase; detected 2.0.10, suggested 2.0.0
[WARNING] org.slf4j.spi: Excessive version increase; detected 2.0.10, suggested 2.0.0
[INFO] Baseline analysis complete, 0 error(s), 4 warning(s)

This is due to the fact that by default maven-bundle-plugin exports each package with the bundle version (if no explicit package version annotation is found). SLF4J isn't following Semantic Versioning according to OSGi (and this should be fine here). I don't foresee any issues with that unless there is a major bundle version update because most consumers should have an import version range covering everything from the current major version till (excluding) the next one. What matters in this context would only be baselining errors caused by the manual 1.8.x version.

Update: One more reasoning about [WARNING] org.slf4j.helpers: Excessive version increase; detected 2.0.10, suggested 2.0.0. One would assume a recommended version 1.8.0 version here as well, but there were some backwards compatible issues introduced like

> class org.slf4j.helpers.NOPLogger
[INFO]          - extends org.slf4j.helpers.MarkerIgnoringBase
...
> method debug(org.slf4j.Marker,java.lang.String)
[INFO]              + access final

I would deliberately ignore this here, as hopefully noone ever used methods from the base class org.slf4j.helpers.MarkerIgnoringBase and the additional final notation on some methods would only affects extensions of those classes (which hopefully never happened either, although those classes are not explicitly mentioned as being ProviderType which is similar to the Eclipse Annotation NoImplement, https://www.ibm.com/docs/es/developer-for-zos/14.2?topic=SSQ2R2_14.2.0/org.eclipse.pde.doc.user/reference/api/org/eclipse/pde/api/tools/annotations/NoImplement.htm)

@kwin
Copy link
Author

kwin commented Nov 14, 2023

@ceki Any feedback?

@bdelacretaz
Copy link

@kwin I reviewed https://jira.qos.ch/browse/SLF4J-579 where @ceki mentions that there were many changes in org.slf4j.helpers and the classes in that package might not be compatible between slf4j 2.x and 1.x versions.

IIUC the baseline tests that you introduce check that compatibility at the API level, but how about implementation? Isn't there a chance that some of the org.slf4j.helpers classes behave differently, even if their API is compatible?

If that's the case, you might need "pinned" unit tests to verify that the behavior of the relevant classes remains stable going forward. Maybe that's just MessageFormatter, out of the many classes in the helpers package?

@kwin
Copy link
Author

kwin commented Nov 25, 2023

Baselining only checks method signatures but I consider this enough here. Semantically incompatible changes for the same method signature are very unlikely, but once there is an actual issue we can fix it then. Hopefully @ceki can decide if there already is an issue, but I understood from JIRA comments that only new stuff has been added in those packages.

@ceki
Copy link
Member

ceki commented Nov 25, 2023

Thank you for this report.

Please let me know if commit 02b36a2 is satisfactory.

@kwin
Copy link
Author

kwin commented Nov 28, 2023

This PR contains baselining which I consider crucial to maintain backwards compatibility. Any reason you don't want to integrate that @ceki?

@ceki ceki closed this Nov 28, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants