为什么在将 Groovy 脚本与 @Grab 一起使用时,带有 slf4j-nop 的 SLF4J 会输出 StaticLoggerBinder 警告

Why does SLF4J with slf4j-nop output the StaticLoggerBinder warning when using a Groovy script with @Grab

我有一个 Groovy 脚本,它使用 Grape @Grab annotation. Included with that are a dependency on spring-web to use RestTemplate, and a dependency on slf4j-nop 指定依赖项以避免 Failed to load class "org.slf4j.impl.StaticLoggerBinder" 警告。

#!/usr/bin/env groovy

@Grab('org.springframework:spring-web:5.3.18')
@Grab('org.slf4j:slf4j-nop:1.7.36')
import org.springframework.web.client.RestTemplate

new RestTemplate().getForObject('http://www.example.com', String)

然而,尽管如此,我仍然收到 SLF4J 警告:

$ ./restTemplateLoggingTest.groovy 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

鉴于它是一个脚本,重要的是输出不包含外来噪音,因为它可能以编程方式使用和操作。

当我 运行 我的脚本时,如何防止输出此日志记录警告?

实验表明,使用 @GrabConfig(systemClassLoader=true) 将依赖项附加到系统类加载器会导致不再发出日志:

#!/usr/bin/env groovy

@GrabConfig(systemClassLoader=true)
@Grab('org.springframework:spring-web:5.3.18')
@Grab('org.slf4j:slf4j-nop:1.7.36')
import org.springframework.web.client.RestTemplate

new RestTemplate().getForObject('http://www.example.com', String)

虽然我有一些模糊的猜测,但我不确定这是为什么。

请注意,尽管解决了这个问题,但这并不是 JavadocsGrabConfig#systemClassLoader 描述的用途:

Set to true if you want to use the system classloader when loading the grape. This is normally only required when a core Java class needs to reference the grabbed classes, e.g. for a database driver accessed using DriverManager.