如何在 sbt 项目中使用来自不同位置的 scala 源并使其与 IntelliJ IDEA 一起使用?

Posted

技术标签:

【中文标题】如何在 sbt 项目中使用来自不同位置的 scala 源并使其与 IntelliJ IDEA 一起使用?【英文标题】:How can I use scala sources from a different location in a sbt project and also make it work with IntelliJ IDEA? 【发布时间】:2017-09-27 00:33:12 【问题描述】:

这个项目使用 sbt 编译和运行良好。 https://github.com/stuhajbejovic/multi-project-sbt

我遇到的问题是当我在 intellij idea 中打开 hello.sbt 项目时,它说:

cannot resolve symbol testing

当我将鼠标悬停在hello.scala 第 1 行的红色导入语句上时。

我也尝试在我的 build.sbt 中使用它:

unmanagedSourceDirectories in Compile += baseDirectory.value / "../common"

但后来我在 IntelliJ 中收到以下警告,并且无法在 IntelliJ 中运行应用程序:

这些源根不能包含在 IDEA 项目模型中。

解决方案:为这些源声明一个 SBT 项目并将该项目包含在依赖项中。

有没有办法让 IntelliJ 遵循 sbt 配置到常见来源的位置?

【问题讨论】:

【参考方案1】:

您需要使用多项目SBT 构建文件。也就是说,为整个项目创建一个build.sbt 文件。 IntelliJ 应该毫无问题地尊重这一点。

我认为应该放在项目根目录中的 build.sbt 文件需要如下所示:

lazy val commonSettings = Seq(
  scalaVersion := "2.12.1",
  version := "0.1"
)

lazy val common = project.in(file("sbt_testing/common")).
settings(commonSettings: _*).
settings(
  name := "common"
)

lazy val hello = project.in(file("sbt_testing/hello")).
dependsOn(common).
settings(commonSettings: _*).
settings(
  name := "Hello"
)

如您所见,您可以对两个项目通用的设置进行分组,并确保它们之间更好的一致性。

您需要删除sbt_testing/commonsbt_testing/hello 中的build.sbt 文件。

更新:更正了 SBT build.sbt 文件中 commonSettings 的使用。为混乱道歉!

更新 2:为了运行 HelloWorld 类中的代码,您需要执行以下操作(我还将“root”项目重命名为“hello”):

$ sbt
[info] Loading global plugins from /home/user/.sbt/0.13/plugins
[info] Loading project definition from /home/user/src/multiSbt/project
[info] Set current project to multisbt (in build file:/home/user/src/multiSbt/)
> project hello
[info] Set current project to Hello (in build file:/home/user/src/multiSbt/)
> run
[info] Compiling 1 Scala source to 
/home/user/src/multiSbt/sbt_testing/hello/target/scala-2.12/classes...
[info] Running HelloWorld 
Hello, world!
This is from common: testing 123
[success] Total time: 3 s, completed May 1, 2017 3:27:16 PM

有关SBT 多项目构建的更多信息,请参阅official documentation...

【讨论】:

我尝试了您提供的示例,但在项目的根目录中运行 sbt 时出现以下错误:$ sbt Loading /usr/share/sbt/bin/sbt-launch-lib.bash Java HotSpot (TM) 64 位服务器 VM 警告:忽略选项 MaxPermSize=256m;在 8.0 /home/st/sbt_testing/build.sbt:7 中删除了支持:错误:使用替代方法重载方法值设置:(ss: sbt.Def.Setting[]*)sbt.Project => Seq[sbt.Def.Setting[]] 不能应用于 (Seq[sbt.Def.Setting[String]]) 设置 (commonSettings)。 ^ /home/st/sbt_testing/build.sbt:14:错误:重载方法值设置 哎呀。你是对的。我稍后会更正代码。很抱歉造成混乱... $ sbt Loading /usr/share/sbt/bin/sbt-launch-lib.bash [info] 将当前项目设置为 sbt_testing(在构建文件中:/home/st/sbt_testing/)> 项目hello [info] 将当前项目设置为 Hello (in build file:/home/st/sbt_testing/) > run [info] Resolving jline#jline;2.14.1 ... [info] 完成更新。 java.lang.RuntimeException:未检测到主类。在 scala.sys.package$.error(package.scala:27​​) [trace] 堆栈跟踪被抑制:运行最后一个 hello/compile:run 以获取完整输出。 [错误] (hello/compile:run) 未检测到主类。 [错误] 总时间:1 s,完成时间 2017 年 5 月 1 日 5:19:00 PM 在我的回答中查看更新 2。 我可以编译但不能运行。你的 build.sbt 在哪个目录?

以上是关于如何在 sbt 项目中使用来自不同位置的 scala 源并使其与 IntelliJ IDEA 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件

如何在 sbt-plugin 中使用 sbt-assembly?

如何在使用 SBT 编译之前进行遮蔽?

如何在 SBT Scala 项目中使用 MySQL JDBC 驱动程序?

如何“包含”来自不同模块的 Thrift 文件?

如何使用 IntelliJ Idea 创建 SBT 项目?