【问题标题】:sbt subproject cannot find it's dependenciessbt 子项目找不到它的依赖项
【发布时间】:2014-07-22 16:37:21
【问题描述】:

我有一个由三个项目 A、B 和 C 组成的项目树

B 依赖于 A,C 依赖于 A 和 B。

A 和 B 在 C 的 lib/ 中签出,并且都使用 sbt compile 构建良好

但是,当我编译 C 时,B 的构建失败,抱怨它找不到某些类型/包:

import org.scalatra.sbt._
import sbt.Keys._
import sbt._

object NwbApiBuild extends Build {
  val Organization = "org.nwb"
  val Name = "NWB API"
  val Version = "0.1.0-SNAPSHOT"
  val ScalaVersion = "2.10.3"
  val ScalatraVersion = "2.3.0"

  lazy val active_slick= Project (
    "active-slick",
    base = file("lib/active-slick")
  )

  lazy val slick_auth= Project (
    "slick-auth",
    base = file("lib/slick-auth")
  )

  lazy val project = Project (
    "root",
    file("."),
    settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraWithJRebel ++ Seq(
      organization := Organization,
      name := Name,
      version := Version,
      scalaVersion := ScalaVersion,
      resolvers += Classpaths.typesafeReleases,
      libraryDependencies ++= Seq(
        "org.scalatra" %% "scalatra" % ScalatraVersion,
        "org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test",
        "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",
        "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "container",
        "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")),
        "com.typesafe.slick" %% "slick" % "2.0.2",
        "mysql" % "mysql-connector-java" % "5.1.31",
        "joda-time" % "joda-time" % "2.3",
        "org.joda" % "joda-convert" % "1.5",
        "com.github.tototoshi" %% "slick-joda-mapper" % "1.1.0",
        "org.json4s" %% "json4s-native" % "3.2.10",
        "org.json4s"   %% "json4s-jackson" % "3.2.7",
        "c3p0" % "c3p0" % "0.9.1.2"
      )
    )
  ) aggregate(active_slick, slick_auth) dependsOn(active_slick, slick_auth)
}

slick auth 的构建文件在哪里

import org.scalatra.sbt._

name := "slick-auth"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.10.3"

val ScalatraVersion = "2.3.0"

lazy val active_slick = Project(
  "active-slick",
  base = file("lib/active-slick")
)

lazy val root = Project(
  "root",
  file("."),
  settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraSettings ++ Seq(
    libraryDependencies ++= Seq(
      "com.typesafe.slick" %% "slick" % "2.0.2",
      "org.slf4j" % "slf4j-nop" % "1.6.4",
      "org.scalatest" %% "scalatest" % "2.2.0" % "test",
      "org.scalatra" %% "scalatra" % ScalatraVersion,
      "org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test",
      "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",
      "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "container",
      "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")),
      "com.typesafe.slick" %% "slick" % "2.0.2",
      "joda-time" % "joda-time" % "2.3",
      "org.joda" % "joda-convert" % "1.5",
      "com.github.tototoshi" %% "slick-joda-mapper" % "1.1.0",
      "org.json4s" %% "json4s-native" % "3.2.10",
      "org.json4s"   %% "json4s-jackson" % "3.2.7",
      "c3p0" % "c3p0" % "0.9.1.2"
    )
  )
).aggregate(active_slick).dependsOn(active_slick)

和active_slick:

name := "active-slick"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.10.3"

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "2.0.2",
  "org.slf4j" % "slf4j-nop" % "1.6.4",
  "org.scalatest" %% "scalatest" % "2.2.0" % "test",
  "com.h2database" % "h2" % "1.3.166" % "test"
)

【问题讨论】:

  • 执行 show slick_auth/allDependencies 不会显示来自 slick_auth 项目的任何依赖项。
  • 更重要的是,显示 slick_auth/root/allDependencies 确实显示了必要的依赖项。我以为file(".") 的项目会变成“默认”
  • 我是否正确理解您希望 A 和 B 只是 C 所依赖的项目,而不是真正成为 C 构建的一部分?如果您将slick_auth 更改为lazy val slick_auth = RootProject(file("lib/slick-auth")) 并将active_slick 更改为lazy val active_slick = RootProject(file("lib/active-slick")),它对您有用吗?
  • 哇,是的!使用 RootProject 确实有效!这可能是文档中被低估的知识......如果您将其作为答案发布,我会接受它。谢谢

标签: scala sbt multi-project


【解决方案1】:

如果您想使用另一个项目作为依赖项(而不是其二进制版本),您可以使用project references。有两种类型的引用,ProjectRefProjectRef 的更简单版本,即RootProject

您应该将构建定义更改为引用slick_auth

lazy val slick_auth = RootProject(file("lib/slick-auth"))

active_slick 一样

lazy val active_slick = RootProject(file("lib/active-slick"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 2011-05-30
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多