【问题标题】:is it necessary to add my custom scala library dependencies in new scala project?是否有必要在新的 scala 项目中添加我的自定义 scala 库依赖项?
【发布时间】:2018-12-13 10:42:41
【问题描述】:

我是 Scala 新手,我正在尝试开发一个使用自定义库的小项目。我在库中创建了一个 mysql 连接池。这是我的 build.sbt

organization := "com.learn"
name := "liblearn-scala"
version := "0.1"
scalaVersion := "2.12.6"

libraryDependencies += "mysql" %  "mysql-connector-java" % "6.0.6"
libraryDependencies += "org.apache.tomcat" % "tomcat-dbcp" % "8.5.0"

我已使用 sbt publishLocal 将相同内容发布到本地常春藤仓库

现在我有一个项目将使用上面的库和以下 build.sbt

name := "SBT1"
version := "0.1"
scalaVersion := "2.12.6"
libraryDependencies += "com.learn" % "liblearn-scala_2.12" % "0.1"

我能够编译新项目,但是当我运行它时,我得到了

 java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSource

但是如果我添加

libraryDependencies += "mysql" %  "mysql-connector-java" % "6.0.6"
libraryDependencies += "org.apache.tomcat" % "tomcat-dbcp" % "8.5.0"

在项目的 build.sbt 中它可以正常工作。

这是使用 scala - sbt 做事的实际方式吗?即:我还必须在项目中提及自定义库的依赖关系?

这是我的库代码(我只有 1 个文件)

package com.learn.scala.db
import java.sql.Connection
import org.apache.tomcat.dbcp.dbcp2._

object MyMySQL {

  private val dbUrl = s"jdbc:mysql://localhost:3306/school?autoReconnect=true"
  private val connectionPool = new BasicDataSource()

  connectionPool.setUsername("root")
  connectionPool.setPassword("xyz")

  connectionPool.setDriverClassName("com.mysql.cj.jdbc.Driver")
  connectionPool.setUrl(dbUrl)
  connectionPool.setInitialSize(3)

  def getConnection: Connection = connectionPool.getConnection

}

这是我的项目代码:

  try {
    val conn = MyMySQL.getConnection
    val ps = conn.prepareStatement("select * from school")
    val rs = ps.executeQuery()

    while (rs.next()) {
      print(rs.getString("name"))
      print(rs.getString("rank"))
      println("----------------------------------")
    }

    rs.close()
    ps.close()
    conn.close()

  } catch {
    case ex: Exception => {
      println(ex.printStackTrace())
    }
  }

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    默认情况下,SBT 会传递地获取所有项目依赖项。这意味着只需要显式声明liblearn-scala,而不是传递依赖关系mysql-connector-javatomcat-dbcp。传递性可以是disabled,传递性依赖可以是excluded,但是除非明确地这样做了,否则它不应该是问题的原因。

    没有看到你的整个build.sbt,我相信你在做正确的事。如果sbt clean publishLocal 没有解决问题,您可以尝试核选项并清除整个常春藤缓存(注意这将强制所有项目重新获取依赖项)。

    【讨论】:

    • 谢谢!,我必须清除整个常春藤缓存,它工作了
    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 2015-10-27
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多