【问题标题】:How to add dependent project in build.sbt for running sbt compile如何在 build.sbt 中添加依赖项目以运行 sbt compile
【发布时间】:2020-01-01 03:40:33
【问题描述】:

我是 sbt build 的新手。 我想将依赖项目(比如 Proj A)的 java 文件添加到我的编译项目(Proj B)中。 在 Proj B 中运行 sbt compile 会引发错误,即找不到依赖项目的 java 包/类。 我浏览了链接:https://www.scala-sbt.org/0.13/docs/Multi-Project.html,但我不清楚添加此依赖项以使其工作。

我尝试在 build.sbt 中添加以下行,但没有成功。 懒惰的 val projB = project.dependsOn(/projA)

更新

projB 的 build.sbt:

organization := "com.org"

name := "projB"

version := "1"

resolvers ++= Seq(
  "Typesafe" at "http://repo.typesafe.com/typesafe/releases/",
  "Java.net Maven2 Repository" at "http://download.java.net/maven/2/",
 )

lazy val projB = project.dependsOn(projA)

// the library dependencies of springframework here

项目 A 的 build.sbt:

organization := "com.org"

name := "proj A"

version := "1"

resolvers ++= Seq(
  "Typesafe" at "http://repo.typesafe.com/typesafe/releases/",
 "Java.net Maven2 Repository" at "http://download.java.net/maven/2/",
 )

// the library dependencies of springframework here

当我在 proj B 上进行 sbt 编译时,它会抛出错误,找不到依赖类。 Hbase 类在 Proj A 中。

[error] import com.org.config.Hbase;
[error] **\hbase\HbaseDAO.java:38:1:
cannot find symbol
[error]   symbol:   class Hbase
[error]   location: class com.org.hbase.HbaseDAO
[error]         private Hbase hbase;
[error] (Compile / compileIncremental) javac returned non-zero exit code
[error] Total time: 6 s, completed 29/08/2019 9:58:39 AM

建议后更新 build.sbt:

inThisBuild(
 Seq(
   organization := "com.org",
   version := "1",
   resolvers ++= Seq(
   "Typesafe" at "http://repo.typesafe.com/typesafe/releases/",
   "Java.net Maven2 Repository" at "http://download.java.net/maven/2/",
  )
 )
)

lazy val root = project
  .in(file("."))
  .aggregate(projA,projB)

lazy val projA = project.settings(
    // project A settings and library dependencies

libraryDependencies += "org.springframework.boot" % "spring-boot-starter- 
parent" % "2.1.6.RELEASE" pomOnly()

libraryDependencies += "org.springframework.boot" % "spring-boot-starter- 
web" % "2.1.6.RELEASE"

libraryDependencies += "org.springframework.data" % "spring-data-hadoop- 
hbase" % "2.3.0.RELEASE"

libraryDependencies += "org.mortbay.jetty" % "jetty" % "7.0.0.pre5"

libraryDependencies += "io.netty" % "netty-all" % "5.0.0.Alpha2"

libraryDependencies += "commons-beanutils" % "commons-beanutils" % "1.9.4"

libraryDependencies += "commons-beanutils" % "commons-beanutils-core" % 
"1.8.3"

libraryDependencies += "xerces" % "xercesImpl" % "2.12.0"

libraryDependencies += "org.apache.hadoop" % "hadoop-yarn-server- 
nodemanager" % "3.2.0"

libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "3.2.0"

libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "2.7.0"

libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "3.2.0"

libraryDependencies += "org.apache.hbase" % "hbase-client" % "2.1.1"

libraryDependencies += "org.apache.hbase" % "hbase" % "2.1.1" pomOnly()

libraryDependencies += "org.apache.hbase" % "hbase-common" % "2.1.1"
)

lazy val projB = project
 .dependsOn(projA)
  .settings(
   // project B settings and library dependencies
libraryDependencies += "org.springframework.boot" % "spring-boot-starter- 
parent" % "2.1.6.RELEASE" pomOnly()

libraryDependencies += "org.springframework.boot" % "spring-boot-starter- 
web" % "2.1.6.RELEASE"

libraryDependencies += "org.springframework.data" % "spring-data-hadoop- 
hbase" % "2.3.0.RELEASE"

libraryDependencies += "org.mortbay.jetty" % "jetty" % "7.0.0.pre5"

libraryDependencies += "io.netty" % "netty-all" % "5.0.0.Alpha2"

libraryDependencies += "commons-beanutils" % "commons-beanutils" % "1.9.4"

libraryDependencies += "commons-beanutils" % "commons-beanutils-core" % 
"1.8.3"

libraryDependencies += "xerces" % "xercesImpl" % "2.12.0"

libraryDependencies += "org.apache.hadoop" % "hadoop-yarn-server- 
nodemanager" % "3.2.0"

libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % 
"2.10.0.pr2"

libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "3.2.0"

libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "3.2.0"

libraryDependencies += "org.apache.hbase" % "hbase-client" % "2.1.1"

libraryDependencies += "org.apache.hbase" % "hbase" % "2.1.1" pomOnly()

libraryDependencies += "org.apache.hbase" % "hbase-common" % "2.1.1"

)

在项目设置 projA 和 projB 中的以下库依赖项之后进行 sbt 编译时引发错误

libraryDependencies += "org.springframework.boot" % "spring-boot-starter- 
web" % "2.1.6.RELEASE"

')' 预期但在 projA 设置和

中为该行抛出了字符串文字

';'预期但在 projB 设置中为该行抛出了字符串文字。

我对这个错误没有太多线索。

【问题讨论】:

  • 嗨西瓦。您能否展示您的build.sbt 的相关部分?当您添加.dependsOn 时,您会收到错误消息吗?应该是lazy val projB = project.dependsOn(projA)(没有斜线,但我认为这只是一个错字)
  • 您好,感谢您的回复。用更多细节更新了问题。我也是 sbt 的新手,我现在的做法可能完全错误。

标签: sbt


【解决方案1】:

查看您发布的两个 sn-ps,我猜您有两个单独的 build.sbt 文件,每个子项目一个。这使他们独立,一个项目只是看不到另一个。虽然子项目可能有多个 build.sbt 文件,但建议在项目根目录中的单个 build.sbt 文件中定义整个多项目构建。

例如,如果您像这样构建项目:

├── project
│  ├── build.properties
│  └── plugins.sbt
├── projA
│  └── src
├── projB
│  └── src
└── build.sbt

然后你可以把所有的构建设置和子项目关系放在根build.sbt

inThisBuild(
  Seq(
    organization := "com.org",
    version := "1",
    resolvers ++= Seq(
      "Typesafe" at "http://repo.typesafe.com/typesafe/releases/",
      "Java.net Maven2 Repository" at "http://download.java.net/maven/2/",
    )
  )
)

lazy val root = project
  .in(file("."))
  .aggregate(projA, projB)

lazy val projA = project
  .settings(
    // project A settings and library dependencies
  )

lazy val projB = project
  .dependsOn(projA)
  .settings(
    // project B settings and library dependencies
  )

然后如果你从项目的根目录启动一个 sbt shell,你可以调用compile(或任何其他任务)来编译projAprojB,或者你可以调用projA/compile来编译它具体的子项目。

您已经在阅读文档,因此您知道在哪里可以找到更多信息。请注意,您提供的链接指向旧文档,顶部有一个指向新页面的横幅:https://www.scala-sbt.org/1.x/docs/Multi-Project.html

【讨论】:

  • 谢谢@laughedelic。我仍然有一些问题。在此文本之后使用最新的 build.sbt 内容更新了帖子:建议后更新 build.sbt
  • .settings(...)内的设置之间需要加逗号
  • 谢谢@laughedelic。它有帮助。我的项目现在编译成功。非常感谢您的帮助。
猜你喜欢
  • 2017-05-20
  • 2014-09-18
  • 1970-01-01
  • 2016-10-23
  • 2014-02-23
  • 1970-01-01
  • 2020-01-03
  • 2020-01-20
  • 1970-01-01
相关资源
最近更新 更多