#scala #dependencies #sbt
#scala #зависимости #sbt
Вопрос:
У меня возникла странная проблема с подпроектами SBT, которая, я думаю, связана с зависимостью. Вот моя настройка:
- У меня есть проект SBT с двумя подпроектами A и B.
- A содержит класс и сопутствующий объект
MyA
- B зависит от A.
- B содержит объект
MyB
, у которого есть основной метод.
Когда я пытаюсь выполнить MyB
из командной строки SBT, я получаю NoSuchMethodError
on MyA
. Это не ClassNotFoundException
, но, возможно, это происходит потому, что он видит MyA
класс в classpath, но не MyA
объект.
В качестве проверки работоспособности я удалил подпроект B и переместил его исходный код в дерево исходных текстов A. Когда я запускаю MyB
из командной строки SBT, все работает так, как ожидалось.
Кто-нибудь сталкивался с этим, или я делаю что-то явно неправильное?
Вот конфигурация моего проекта:
class MyProject(info: ProjectInfo) extends ParentProject(info) {
lazy val a = project("a", "a", new AProject(_))
lazy val b = project("b", "b", new BProject(_), a)
object Dependencies {
lazy val scalaTest = "org.scalatest" % "scalatest_2.9.0" % "1.4.1" % "test"
}
class AProject(info: ProjectInfo) extends DefaultProject(info) with AutoCompilerPlugins {
val scalaTest = Dependencies.scalaTest
val continuationsPlugin = compilerPlugin("org.scala-lang.plugins" % "continuations" % "2.9.0")
override def compileOptions = super.compileOptions compileOptions("-P:continuations:enable") compileOptions("-unchecked")
}
class BProject(info: ProjectInfo) extends DefaultProject(info)
}
Комментарии:
1. ОБНОВЛЕНИЕ: похоже, это ошибка компиляции. Я скомпилировал комбинированное дерево исходных текстов A B, затем скопировал только классы B в
b/target/...
каталог иMyB
работает корректно.
Ответ №1:
Оказывается, была проблема с включением плагина continuations в проекте B. Вот моя рабочая конфигурация:
class MyProject(info: ProjectInfo) extends ParentProject(info) {
lazy val a = project("a", "a", new AProject(_))
lazy val b = project("b", "b", new BProject(_), a)
object Dependencies {
lazy val scalaTest = "org.scalatest" % "scalatest_2.9.0" % "1.4.1" % "test"
}
class AProject(info: ProjectInfo) extends DefaultProject(info) with AutoCompilerPlugins {
val scalaTest = Dependencies.scalaTest
val continuationsPlugin = compilerPlugin("org.scala-lang.plugins" % "continuations" % "2.9.0")
override def compileOptions = super.compileOptions compileOptions("-P:continuations:enable") compileOptions("-unchecked")
}
class BProject(info: ProjectInfo) extends DefaultProject(info) with AutoCompilerPlugins {
override def compileOptions = super.compileOptions compileOptions("-P:continuations:enable") compileOptions("-unchecked")
}
}