如何将库依赖项添加到 Build.scala 的类路径?

Posted

技术标签:

【中文标题】如何将库依赖项添加到 Build.scala 的类路径?【英文标题】:How to add library dependency to classpath of Build.scala? 【发布时间】:2015-07-02 19:20:09 【问题描述】:

我试图在我的Build.scala 中使用sqlite-jdbc driver 在编译之前生成一个带有一些必要表的sqlite db。这就是我为实现这一目标而写的:

compile in Compile <<= (compile in Compile) map  result =>
  val sqliteDb = file("my_sqlite.db")
  if (!sqliteDb.exists()) 
    val connection = DriverManager.getConnection(s"jdbc:sqlite:$sqliteDb.getAbsolutePath")
    val statement = connection.prepareStatement("create table EXAMPLE ( ... );")
    statement.execute()
    statement.close()
    connection.close()
  
  result

这一切都很好,但是当我运行 compile 时,我得到了这个错误:

[error] (my-project/compile:compile) java.sql.SQLException: No suitable driver found for jdbc:sqlite:/Users/2rs2ts/src/my-project/my_sqlite.db

现在这有点令人沮丧,因为我认为我可以通过创建递归项目将该依赖项添加到 Build.scala 的类路径中。我的目录结构如下:

my-project/
  project/
    Build.scala
    build.sbt
    project/
      build.sbt

my-project/project/project/build.sbt 看起来像这样:

libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.8.10.1"

编辑:我也把那行放在my-project/project/build.sbt 中,但它没有解决我的问题。

那么……我做错了什么?我需要对类路径的这种依赖才能使 sqlite 驱动程序正常工作。

【问题讨论】:

无论您面临何种错误消息,您都应该在编译时进行此类工作。编译时间可能足够长,可以尽可能多地跳过它,并且您正在为它添加更多工作。不要! @JacekLaskowski 在对项目进行任何操作之前,我试图保证该文件存在并且具有正确的表。这包括:运行它,运行它的测试,并以不同的格式打包它。 【参考方案1】:

那么……我做错了什么?

你走得太远了。将libraryDependenciesmy-project/project/project/build.sbt 移动到my-project/project/build.sbt,这样它将在my-project/project/Build.scala 中可用。

【讨论】:

我找到了解决方案。通常在依赖项的Driver 实现中有一个static 块,它用DriverManager 注册它,但由于某种原因,直到我在Build.scala 中实际引用它时它才会被执行。关于这个 sqlite 驱动程序应该如何工作的一个怪癖......我不明白为什么 static 块没有被执行,但至少我的问题已经解决了。

以上是关于如何将库依赖项添加到 Build.scala 的类路径?的主要内容,如果未能解决你的问题,请参考以下文章

将库从依赖项重定位到 package.json 中的 devDependencies 块的命令?

Angular CLI 6:将库依赖项放在哪里

为啥将库添加到链接器命令行两次?

Play 2.0 / SBT:从 Build.scala 中的某些/所有模块中排除某些传递依赖项

idea怎么将库添加到类路径

如何将 sbteclipse 插件添加到 SBT 0.10.x