2017-05-03 4 views
1

私はSBTアプリケーション内でSLF4Jを構成しています。テストとランタイムのスコープは、期待していたものとは異なった働きをしています。sbtテストスコープにはランタイムが含まれていますか?

私が欲しいのセットアップ:

  • テスト(SBT試験):実装
  • バンドル/生産ランタイム(SBTラン)としてslf4-simpleを使用:使用log4j-slf4j-impl

関連build.sbt(SBT 0.13)セクション:

libraryDependencies += "org.slf4j" % "slf4j-simple" % "1.7.25" % Test, 
libraryDependencies += "org.apache.logging.log4j" % "log4j-api" % 2.8.2 % Runtime, 
libraryDependencies += "org.apache.logging.log4j" % "log4j-core" % 2.8.2 % Runtime, 
libraryDependencies += "org.apache.logging.log4j" % "log4j-slf4j-impl" % 2.8.2 % Runtime 

T彼は2つのslf4jバインディングがあり、log4jのものとシンプルなものがあるということです。

ランタイム依存性をテストスコープからどのように除外できるのか、あるいはこれがここでは間違ったアプローチになっているのでしょうか。

質問を抽出するには:相互排他的ないくつかの異なるjarファイルを実行時とテストの両方で使用したい。どのようにsbt 0.13でこれを行うことができますか?

答えて

1

問題は、テストスコープにコンパイルとおそらくランタイムが含まれていることです。ランタイムに追加するものは、Testにも追加されています。

次のようなテストクラスパスからlog4j-slf4j-implを除外しようとすることができます:

fullClasspath.in(Test) := fullClasspath.in(Test).value.filterNot(_.data.getName.contains("log4j-slf4j-impl")) 
+0

がこの正確な懸念のために働く、ありがとうございます。しかし、それは私が得ない「おそらくランタイム」の部分です。これは一般的なパラダイムのようです。 prodではmysqlがテストではh2、prodとtestとでは異なるロガーなど。これはどのようにsbtで行われますか?奇妙なテストにはこのようなランタイムが含まれているようです。 – drobert

+0

slf4jで見られるこのクラスパスバインディング機能を持つライブラリがたくさん見つかりません。 Slf4jは妥当な痛みです。ほとんどのライブラリ作成者は、依存関係にバインディングを間違って追加するのに対し、間違ってバインドを追加します。 log4jなどを使用するかどうかを選択する必要があります。今あなたがテストのために何もh2を使用する場合は、そこにあなたを防ぐことはありません。 h2はテストコードでのみ表示され、問題なく使用することができます。 h2は、MySQLがクラスパスに入っていることを不平にしません(MySQLはh2についても不平を言うことはありません)。このクラスパスの動作は明示的にslf4jです。 – marios

関連する問題