尝试执行编译任务但无法加载神秘模块

Posted

技术标签:

【中文标题】尝试执行编译任务但无法加载神秘模块【英文标题】:Attempting to execute compile task but mystery module can't be loaded 【发布时间】:2021-10-04 17:51:13 【问题描述】:

我正在编译一个多部分的 Scala 项目。它不是那么大,但其中一些是 Scala 2.13,一些是 Scala 3。

尝试编译会产生致命错误 [UNRESOLVED DEPENDENCIES: base#base_2.12;0.1.0-SNAPSHOT:未找到]

问题是,字符串 0.1.0-SNAPSHOT 不会出现在我的 build.sbt 或其他任何地方的任何地方。它曾经在那里,但它早已不复存在。我假设某些更新缓存包含它,但我一直找不到它。

这是我的 build.sbt:

ThisBuild / libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.7" % Test
ThisBuild / Compile / scalacOptions ++= Seq("--deprecation")

ThisBuild / Test / logBuffered := false
ThisBuild / Test / parallelExecution := false

lazy val scala213 = "2.13.5"
lazy val scala212 = "2.12.13"
lazy val scala3 = "3.0.0-RC2"
lazy val supportedScalaVersions = List(scala213, scala3)

lazy val root = (project in file("."))
  .aggregate(top, trans, base)
  .settings(
    name := "toysat"
  )

lazy val top = (project in file("top"))
  .settings(
    name := "main",
    scalaVersion := scala213,
    scalacOptions += "-Ytasty-reader",
    libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.7" % Test
  )
  .dependsOn(trans, base)

lazy val trans = (project in file("trans"))
   .settings(
     name := "trans",
     Compile / scalaVersion := scala3,
     libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.7" % Test
   ).
  dependsOn(base)

lazy val base = (project in file("base"))
  .settings(
    name := "base",
    scalaVersion := scala213,
    libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.7" % Test
   

*** 上的大多数此类问题都是关于下载远程定义的模块。我遇到的问题是 sbt 找不到我的(新编译的)模块之一的过时版本。

这里是 sbt 命令输出(这是一个 Emacs 缓冲区):

sbt:toysat> reload
[info] welcome to sbt 1.5.5 (AdoptOpenJDK Java 1.8.0_292)
[info] loading project definition from /Users/drewmcdermott/BIG/RESEARCH/puzzles/toystory4/toysat/project
[info] loading settings for project root from build.sbt ...
[info] set current project to toysat (in build file:/Users/drewmcdermott/BIG/RESEARCH/puzzles/toystory4/toysat/)
sbt:toysat> compile
[info] compiling 4 Scala sources to /Users/drewmcdermott/BIG/RESEARCH/puzzles/toystory4/toysat/base/target/scala-2.13/classes ...
[warn] 
[warn]  Note: Unresolved dependencies path:
[info] done compiling
[error] stack trace is suppressed; run last trans / update for the full output
[error] (trans / update) sbt.librarymanagement.ResolveException: Error downloading base:base_2.12:0.1.0-SNAPSHOT
[error]   Not found
[error]   Not found
[error]   not found: /Users/drewmcdermott/.ivy2/localbase/base_2.12/0.1.0-SNAPSHOT/ivys/ivy.xml
[error]   not found: https://repo1.maven.org/maven2/base/base_2.12/0.1.0-SNAPSHOT/base_2.12-0.1.0-SNAPSHOT.pom
[error] Total time: 25 s, completed Jul 28, 2021 11:06:18 PM

编译base子项目中的4个文件花费了25秒,显然是成功的。我认为当 sbt 尝试编译 trans 子项目时它会遇到麻烦。

这是部分堆栈跟踪。除了 Coursier 参与之外,这对我没有任何意义。

sbt:toysat> last trans / update
[debug] not up to date. inChanged = true, force = false
[debug] Updating trans...
[warn] 
[warn]  Note: Unresolved dependencies path:
[error] sbt.librarymanagement.ResolveException: Error downloading base:base_2.12:0.1.0-SNAPSHOT
[error]   Not found
[error]   Not found
[error]   not found: /Users/drewmcdermott/.ivy2/localbase/base_2.12/0.1.0-SNAPSHOT/ivys/ivy.xml
[error]   not found: https://repo1.maven.org/maven2/base/base_2.12/0.1.0-SNAPSHOT/base_2.12-0.1.0-SNAPSHOT.pom
[error]     at lmcoursier.CoursierDependencyResolution.unresolvedWarningOrThrow(CoursierDependencyResolution.scala:258)
[error]     at lmcoursier.CoursierDependencyResolution.$anonfun$update$38(CoursierDependencyResolution.scala:227)
[error]     at lmcoursier.CoursierDependencyResolution$$Lambda$4262/0x0000000000000000.apply(Unknown Source)
[error]     at scala.util.Either$LeftProjection.map(Either.scala:573)
[error]     at lmcoursier.CoursierDependencyResolution.update(CoursierDependencyResolution.scala:227)
[error]     at sbt.librarymanagement.DependencyResolution.update(DependencyResolution.scala:60)
[error]     at sbt.internal.LibraryManagement$.resolve$1(LibraryManagement.scala:59)

似乎很明显,某处的某个缓存保留了字符串0.1.0-SNAPSHOT,但缓存的数量非常多。我已经尝试删除了几个,但我没有找到相关的。

有人能解释一下如何从这种情况中恢复过来吗?

【问题讨论】:

你在编译哪个项目版本? (version.sbt) 所以我发现 0.1.0-SNAPSHOT 是 sbt 的默认版本。如果我在子项目定义中将其设置为“3.0”,它现在无法找到 base:base_2.12:3.0。我想这就是进步。 好的,现在说得通了。我会在下面用答案来解释 【参考方案1】:

您的 base 项目仅针对 Scala 2.13 编译,而它被定义为以 Scala 3 为目标的 trans 的依赖项(使用 dependsOn)。

您应该为 Scala 2.13 和 3 交叉构建您的 base 项目(根据您的错误消息可能是 2.12,即使我在您共享的内容中没有看到 Scala 2.12 的任何用途)。

编辑:Scala 2.13 和 3 是兼容的,因此只有在仅为 2.12 构建依赖项时才会出现此问题。

【讨论】:

谢谢@GaelJ。但是,我想我不明白“交叉构建”是什么意思。 base 中的内容与 Scala 3 不兼容,但这不应该是相关的,不是吗?一旦编译完成,它就是 JVM 字节码,trans(在 Scala 3 中 )中的东西应该能够运行它,不是吗? 这并不完全正确:例如,Scala 代码在 2.12 和 2.13 之间不兼容二进制。然而 Scala 2.13 和 3 在某种程度上是兼容的(参见docs.scala-lang.org/scala3/guides/migration/…)。 所以实际的问题是“2.12”从哪里来,因为你是对的 2.13 和 3.0 应该可以工作。 我得到了它的工作,虽然我仍然不确定如何。我安装了插件 sbt-projectmatrix 并按照说明进行操作。我不得不做进一步的改变,我不明白,但它奏效了!这条评论对于我的整个 build.sbt 来说太小了,但是 projectmatrix 插件要求每个子项目都以这种风格定义,在下一条评论中显示子项目trans【参考方案2】:

我不是因为我是一个自恋者而回答我自己的问题,而是因为我不能在评论中说出我想要什么。加上编辑原始问题会将可能有用的信息埋在一个奇怪的地方。我已经投票并批准了@GaelJ 的回答。

我的 build.sbt 看起来并没有那么不同。可以通过显示修改后的trans 子项目定义来封装差异:

lazy val trans = (projectMatrix in file("trans"))
   .settings(
     name := "trans",
     version := "0.3",
     // I thought this line was unnecessary, but without 
     // it sbt doesn't understand the command trans / compile --
     Compile / scalaVersion := scala3,
     libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.7" % Test
   )
  .jvmPlatform(scalaVersions = Seq(scala213))
  .dependsOn(base)

【讨论】:

以上是关于尝试执行编译任务但无法加载神秘模块的主要内容,如果未能解决你的问题,请参考以下文章

无法加载模块脚本 - 在 index.html 中导入类

无法导入numpy,DLL加载失败:找不到指定的模块

C#程序在VS编译器加载时出现找不到方法,无法显示该程序窗体设计器

无法将模块“Snapkit”加载为“Snapkit”

Angular - 无法加载模块脚本:

无法在 Windows 上使用电子 4.0.6 加载一些本机节点 js 模块