You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT未自动检测跨项目源代码变更并重新编译问题

SBT无法正确检测源代码变更并重新编译

我正在构建一个包含两个项目的多项目工程:

  • cli:作为根项目的命令行界面,仅支持JVM,用于调用lib库
  • lib:跨平台项目(同时支持JVM和JS),供cli调用,需单独发布

最小示例的build.sbt文件如下:

ThisBuild / scalaVersion := "3.3.1"

lazy val lib = crossProject(JSPlatform, JVMPlatform)
  .crossType(CrossType.Full)
  .in(file("lib"))
  .jsSettings(scalacOptions ++= Seq("-scalajs"))

lazy val cli = (project in file("."))
  .dependsOn(lib.jvm)
  .aggregate(lib.jvm, lib.js)

位于lib/shared/src/main/scala/mylib/MyLib.scala的库代码为:

package mylib

object MyLib {
  val life = 42 + 0
}

位于src/main/scala/myapp/Main.scala的命令行入口代码为:

package myapp

object Main {
  def main(args: Array[String]): Unit = {
    println(mylib.MyLib.life)
  }
}

在SBT中运行程序,输出为42。但当我将life的定义修改为life = 42 + 1并重新运行程序时,输出仍为42。

测试中,我于16:02修改了MyLib.scala,16:05重新运行程序。lib/jvm/target目录下的MyLib类文件已更新,但./target目录下的对应类文件未更新,文件时间戳如下:

-rw-r--r--  1 bwbecker  staff   695  7 Mar 16:05 ./lib/jvm/target/scala-3.3.1/classes/mylib/MyLib$.class
-rw-r--r--  1 bwbecker  staff   280  7 Mar 16:05 ./lib/jvm/target/scala-3.3.1/classes/mylib/MyLib.class
-rw-r--r--  1 bwbecker  staff    52  7 Mar 16:02 ./lib/shared/src/main/scala/mylib/MyLib.scala
-rw-r--r--  1 bwbecker  staff   107  7 Mar 15:19 ./src/main/scala/myapp/Main.scala
-rw-r--r--  1 bwbecker  staff  1002  7 Mar 15:52 ./target/scala-3.3.1/classes/myapp/Main$.class
-rw-r--r--  1 bwbecker  staff   296  7 Mar 15:52 ./target/scala-3.3.1/classes/myapp/Main.class
-rw-r--r--  1 bwbecker  staff   695  7 Mar 15:59 ./target/scala-3.3.1/classes/mylib/MyLib$.class
-rw-r--r--  1 bwbecker  staff   280  7 Mar 15:59 ./target/scala-3.3.1/classes/mylib/MyLib.class

操作仅使用sbt和vi,无IDE干扰。我推测是build.sbt配置有误,已查阅SBT文档及相关StackOverflow文章,但未发现问题,怀疑与crossProject有关。

使用环境:SBT v1.9.7升级至1.9.9问题依旧,MacOS 14.2.1,openjdk 17.0.9。

内容的提问来源于stack exchange,提问作者bwbecker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:55:25