【问题标题】:Why doesn't sbt automatically add libraryDependencies to class path?为什么 sbt 不自动将 libraryDependencies 添加到类路径?
【发布时间】:2018-02-10 20:37:39
【问题描述】:

为什么 sbt 不自动将 libraryDependencies 添加到类路径?我正在尝试将 jdbc-sqlite 添加到我的项目中,但是找不到驱动程序。 lib 依赖项由 sbt 管理,因此它应该是类路径的一部分。但我猜不是,那我怎么添加呢?

为这些仅存在于我的盒子上的库定义路径引用感觉是一种不好的做法。

name := "CacheWarmer"

version := "0.1"

scalaVersion := "2.12.3"

mainClass in Compile := Some("process.Daemon")

libraryDependencies ++= Seq(
  "org.xerial" % "sqlite-jdbc" % "3.20.0" % "test"
)

package process

import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Statement

代码

object Daemon {
  def main(args: Array[String]): Unit = {
    //Gets java.sql.SQLException: No suitable driver found for jdbc:sqlite::memory:
    val connection:Connection = DriverManager.getConnection("jdbc:sqlite::memory:")
  }
}

【问题讨论】:

  • 当然,编译/运行时依赖项在 sbt 运行和测试类路径中可用。
  • 不是根据我的运行时间说它找不到我的 jdbc-sqlite 驱动程序

标签: java scala sbt


【解决方案1】:

Maven 中心告诉你要在 SBT 中使用该依赖项,你应该使用:

libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.20.0" --> 注意没有双重%

%% 告诉 sbt 将当前的 scala 版本附加到工件名称。假设您正在运行 scala 2.11:

libraryDependencies += "org.some" %% "myscala" % "3.20.0"

建议:

`libraryDependencies += "org.some" % "myscala_2.11" % "3.20.0"`

【讨论】:

    【解决方案2】:

    您已将sqlite-jdbc 依赖项放入test 范围。自然,此类依赖项仅在测试类路径中可用,而在“主”类路径中不可用。通常您使用 test 范围来测试依赖项,例如测试 Scalatest 或 JUnit 等库。

    为了使库在您的“主”类路径中可用,您必须使用 compile 范围,或者,完全不使用范围分类器:

    libraryDependencies ++= Seq(
      "org.xerial" % "sqlite-jdbc" % "3.20.0"
    )
    

    【讨论】:

    • 他们没有附加 scala 版本,导致问题找不到合适的 scala 版本。
    • @Dr.Knowitall 对不起,我的错,应该删除 %% 以支持 %。由于这是一个纯 Java 库,因此无需向其附加 Scala 二进制版本,这正是 %% 所做的。修正了答案。
    猜你喜欢
    • 2012-08-26
    • 2021-07-21
    • 2019-03-10
    • 1970-01-01
    • 2016-11-04
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多