为什么 SBT 在编译时找到导入而不是在构建项目时找到导入?

Why does SBT find imports while compiling but not while building the project?

我正在做一个 Scala sbt 项目,项目结构是这样的。

这是 build.sbt 文件的内容:

name := "Blitzkreig"

version := "0.1"

scalaVersion := "2.13.2"

// https://mvnrepository.com/artifact/mysql/mysql-connector-java
libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.21"

我在外部添加的唯一jar是gsp.jar,可以在上面的项目结构图中看到。 我将 jar 添加为库 -> + -> Java 模块 -> Path_Of_Jar_File.

当我完成代码时,我没有看到任何导入语句的编译错误。但是当我构建项目时,我看到相同的导入语句给出错误,所有错误都来自 gsp.jar 文件。

例如:

导入语句出错的包也存在,如下图所示。

当我点击构建 jar 时,我看到相同的导入语句导致如下错误。

[info] Executing in batch mode. For better performance use sbt's shell
[success] Total time: 0 s, completed 26 Nov, 2020 4:33:10 PM
[info] Compiling 17 Scala sources to /Users/bobby/IdeaProjects/Blitzkreig/target/scala-2.13/classes ...
[error] /Users/bobby/IdeaProjects/Blitzkreig/src/main/scala/com/tablecolumn/TGetTableColumn.scala:5:8: not found: object gudusoft
[error] import gudusoft.gsqlparser._

是不是我导入jar文件到项目中的方式有​​问题。谁能告诉我我做错了什么?

您只在 IntelliJ 中添加了 JAR,sbt 看不到它。所以 IntelliJ 编译器可能能够编译代码并且不显示任何错误,但 sbt 只看到缺少的包。

如果你想避免此类问题,切勿通过 IDE 添加库,始终通过你的构建工具(无论是 sbt、Maven、gradle 或其他东西),然后在 IDE 中刷新你的项目(对于每个构建系统,都有一个专门的选项来重新同步构建)。

您在外部添加了“仅一个包”并不重要 - 如果您添加了任何包而忽略了构建系统,那么您的设置就会损坏。

如果你想添加非托管依赖(因为例如它没有发布在 artifactory 上)将它添加到 lib directory