Несколько привязок SLF4J с Play 2.3.8

Я использую Play Framework 2.3.8 (для Java) с Scala 2.11.

Я получаю это предупреждение:

SLF4J: путь к классу содержит несколько привязок SLF4J.
SLF4J: Обнаружена привязка в [jar:file:/Users/vdanylchuk/.ivy2/cache/org.slf4j/slf4j-simple/jars/slf4j-simple-1.7.7.jar!/Org/slf4j/impl/StaticLoggerBinder.class.]
SLF4J: Обнаружена привязка в [jar:file:/Users/vdanylchuk/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar!/ Org / slf4j / impl / StaticLoggerBinder.учебный класс]
SLF4J: См. http://www.slf4j.org/codes.html для объяснения.

Это вызывает реальные проблемы во время выполнения случайным образом. На некоторых из развернутых хостов все идет хорошо, и журналы пишутся как настроено. На других хостах побеждает неправильная привязка, а журналы записываются в неправильном месте. Процесс развертывания по сценарию и точно так же. Таким образом, предупреждение на http://www.slf4j.org/codes.html является правильным, и это случайно, поэтому мне нужно удалить дополнительную привязку.

Самое интересное, что они оба взяты из среды Play. logback-classic (который я на самом деле хочу использовать) происходит из библиотеки play, а slf4j-simple - из плагина play sbt.

Я прочитал много подобных вопросов здесь и в списках рассылки. Пример: Как исправить "SLF4J: путь к классу содержит несколько привязок SLF4J" при запуске Play 2.3.x? Распространенным решением является использование некоторой формы правил исключения. Ни одно из предложенных решений не помогло мне. [Обновление: на самом деле они это делают - см. Решение ниже.] Я бы не ожидал, что slf4j-simple появится в конечном пути к классам, но это так. Несмотря на то, что я добавил excludeAll(ExclusionRule(organization = "org.slf4j")) для каждой зависимости в моем проекте, кроме фреймворка play.

Любые идеи о том, как избавиться от slf4j-просто? Предпочтительно на уровне проекта sbt, без очистки вручную пути к классу результата сборки.

Обновление: инструкция по воспроизведению

Я сузил это с небольшим тестовым проектом. Оказывается, это вызвано комбинацией плагина play sbt и плагина aether-deploy, который мы используем. Достаточно иметь эту маленькую конфигурацию.
build.sbt:

name := "slf4j-test"
version := "1.0"
scalaVersion := "2.11.5"
lazy val root = (project in file(".")).enablePlugins(PlayJava)


Проект / plugins.sbt:

resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8")
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.13")


проекта / build.properties:

sbt.version=0.13.7

Затем просто запустите "sbt test: compile" или "sbt run" (и запросите localhost:9000), чтобы увидеть предупреждение. То же самое работает со Scala 2.10.

2 ответа

Решение

Виноват. В конце концов, простое исключение в проекте /plugins.sbt исправило это:

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8" exclude("org.slf4j", "slf4j-simple"))

Я пробовал это ранее, но, видимо, допустил синтаксическую ошибку и подумал, что это не поддерживается. Facepalm

В итоге мне пришлось сделать что-то немного другое, что я видел в другом посте. Помещение здесь, если кто-то ищет ужасные множественные привязки, сначала попадет на эту страницу:

Как исправить "SLF4J: путь к классу содержит несколько привязок SLF4J" при запуске Play 2.3.x?

libraryDependencies ++= Seq(
  ...
).map(_.force())

libraryDependencies ~= { _.map(_.exclude("org.slf4j", "slf4j-nop")) }
Другие вопросы по тегам