Объяснение разницы между выражениями, определяющими библиотечную зависимость

63
7

Я не могу понять разницу между следующими выражениями. Выражения a reduced - случай реального мира имеет больше настроек, распределенных в отдельных объектах.

задан непосредственно в виде последовательности

Seq(libraryDependencies +=
"org.openjdk.jmh" % "jmh-core" % "1.6.2" % "compile")

завернутый inConfig

inConfig(Compile)(libraryDependencies +=
"org.openjdk.jmh" % "jmh-core" % "1.6.2" % "compile")

В обоих случаях show compile:libraryDependencies показывает то же самое

[info] List(org.scala-lang:scala-library:2.10.4, org.openjdk.jmh:jmh-core:1.6.2:compile)

но для show compile:managedClasspath зависимость от JMH показана только в первом случае. В результате нормальный компилятор работает с ошибкой из-за неразрешимых классов.

Объясните или укажите логическую разницу между обоими случаями.

спросил(а) 2021-01-25T13:20:34+03:00 4 месяца, 4 недели назад
1
Решение
63

TL;DR: Используйте % "compile" не Compile при объявлении libraryDependencies

То, что вы видите, - это пробел, возможно, ошибка в том, как sbt пытается использовать конфигурации модулей Ivy (например, compile) в качестве одной из своих областей настройки.

Для справки:

Проблема заключается в том, что в настоящее время вы можете объявить конфигурацию как на уровне значений:

  "org.openjdk.jmh" % "jmh-core" % "1.6.2" % "compile"

и ключевой уровень:

  inConfig(Compile)(libraryDependencies += xyz)

или альтернативно:

  libraryDependencies in Compile += xyz

Как вы говорите в обоих примерах show compile:libraryDependencies показывает одну и ту же последовательность, но show libraryDependencies демонстрирует, что вы только добавили jmh-core в осях Compile libraryDependencies:

show libraryDependencies

[info] List(org.scala-lang:scala-library:2.10.4, org.openjdk.jmh:jmh-core:1.6.2:compile)

show libraryDependencies

[info] List(org.scala-lang:scala-library:2.10.4)

Затем это приводит к тому, почему show compile:managedClasspath отличается.

Посмотрите, что inspect actual compile:managedClasspath выходы inspect actual compile:managedClasspath:

[info] Task: scala.collection.Seq[sbt.Attributed[java.io.File]]
[info] Description:
[info] The classpath consisting of external, managed library dependencies.
[info] Provided by:
[info] {file:/Users/dnw/Desktop/t-2015-04-08.0540/}t-2015-04-08-0540/compile:managedClasspath
[info] Defined at:
[info] (sbt.Classpaths) Defaults.scala:991
[info] Dependencies:
[info] *:update
[info] */*:classpathTypes
[info] compile:classpathConfiguration
[info] compile:managedClasspath::streams
[info] Reverse dependencies:
[info] compile:externalDependencyClasspath
[info] Delegates:
[info] compile:managedClasspath
[info] *:managedClasspath
[info] {.}/compile:managedClasspath
[info] {.}/*:managedClasspath
[info] */compile:managedClasspath
[info] */*:managedClasspath
[info] Related:
[info] test:managedClasspath
[info] runtime:managedClasspath

Следует отметить его зависимость от *:update, которая не предназначена для compile. Оттуда он в конечном итоге приводит к *:libraryDependencies который во втором примере не содержит jmh-core.

ответил(а) 2021-01-25T13:20:34+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема