sbt- assembly:Logback 不适用于 uber-JAR

Han*_*nes 6 scala logback sbt sbt-assembly

如果我在IntelliJ中运行应用程序,日志记录工作正常,但如果我运行 \xc3\xbcber-JAR,则会出现以下错误:

\n
LF4J: No SLF4J providers were found.\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.\n
Run Code Online (Sandbox Code Playgroud)\n

我使用以下配置使用sbt-assemble构建 \xc3\xbcber-JAR :

\n
lazy val app = (project in file("."))\n  .settings(\n    assembly / mainClass := Some("com.example.app.Main"),\n    assembly / assemblyJarName := "gcm.jar",\n    assembly / assemblyMergeStrategy := {\n      case PathList("META-INF", xs@_*) => MergeStrategy.discard\n      case PathList("reference.conf") => MergeStrategy.concat\n      case x => MergeStrategy.first\n    }\n  )\n
Run Code Online (Sandbox Code Playgroud)\n

Logbackscala-logging的依赖关系是:

\n
ThisBuild / libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.4.0"\nThisBuild / libraryDependencies += "com.typesafe.scala-logging" %% "scala-logging" % "3.9.5"\n
Run Code Online (Sandbox Code Playgroud)\n

logback.xml

\n
<?xml version="1.0" encoding="UTF-8" ?>\n<!DOCTYPE configuration>\n\n<configuration>\n    <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>\n    <import class="ch.qos.logback.core.ConsoleAppender"/>\n    <import class="ch.qos.logback.core.FileAppender"/>\n\n    <appender name="STDOUT" class="ConsoleAppender">\n        <encoder class="PatternLayoutEncoder">\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <appender name="FILE" class="FileAppender">\n        <file>gcm.log</file>\n        <append>true</append>\n        <immediateFlush>true</immediateFlush>\n        <encoder class="PatternLayoutEncoder">\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <root level="debug">\n        <appender-ref ref="STDOUT"/>\n        <appender-ref ref="FILE"/>\n    </root>\n</configuration>\n
Run Code Online (Sandbox Code Playgroud)\n

..

\n

Geo*_*off 8

发生这种情况是因为服务提供者(在 META-INF 中定义)被您的合并策略丢弃。从 logback 1.2.x 迁移到 1.4.x 时,我遇到了同样的问题。

我在sbt-assemble 文档中找到的一个选项是将 META-INF 案例替换为:

case PathList("META-INF", xs@_*) =>
  (xs map {_.toLowerCase}) match {
    case "services" :: xs =>
      MergeStrategy.filterDistinctLines
    case _ => MergeStrategy.discard
  }
Run Code Online (Sandbox Code Playgroud)

有没有办法查明是否是这种情况以及如果是什么导致了冲突?

在调试模式下运行./sbt assembly --debug可能有助于识别哪些文件被丢弃:

...
[debug] Merging 'META-INF/services/ch.qos.logback.classic.spi.Configurator' with strategy 'discard'
[debug] Merging 'META-INF/services/jakarta.servlet.ServletContainerInitializer' with strategy 'discard'
[debug] Merging 'META-INF/services/org.slf4j.spi.SLF4JServiceProvider' with strategy 'discard'
...
Run Code Online (Sandbox Code Playgroud)