Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

is it necessary to add my custom scala library dependencies in new scala project?

Tags:

scala

sbt

I am new to Scala and I am trying to develop a small project which uses a custom library. I have created a mysql connection pool inside the library. Here's my build.sbt for library

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"

I have published the same to local ivy repo using sbt publishLocal

Now I have a project which will be making use of the above library with following build.sbt

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

I am able to compile the new project but when I run it I get

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

But if I add

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

in the project's build.sbt it works without any issues.

Is this the actual way of doing things with scala - sbt? ie : I have to mention dependencies of custom library also inside the project?

Here is my library code (I have just 1 file)

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

}

This is my project code:

  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())
    }
  }
like image 817
TheNormalGuy Avatar asked Dec 30 '25 23:12

TheNormalGuy


1 Answers

By default SBT fetches all project dependencies, transitively. This means it should be necessary to explicitly declare only liblearn-scala, and not also the transitive dependencies mysql-connector-java and tomcat-dbcp. Transitivity can be disabled, and transitive dependencies can be excluded, however unless this has been done explicitly, then it should not be the cause of the problem.

Without seeing your whole build.sbt, I believe you are doing the right thing. If sbt clean publishLocal is not solving the problem, you could try the nuclear option and clear the whole ivy cache (note this will force all projects to re-fetch dependencies).

like image 179
Mario Galic Avatar answered Jan 01 '26 14:01

Mario Galic