从单个jar运行时,找不到适合的jdbc:mysql驱动程序。

5
我有一个Scala测试项目,它会将一些信息写入到MySQL数据库中。我使用sbt设置了这个项目,并使用sbt-eclipsify,以便可以从eclipse中运行它。我还使用了sbt插件sbt-assembly来创建一个包含所有依赖库所需类的单个JAR文件。我可以从eclipse和sbt中毫无问题地运行程序。
我使用sbt-assembly构建的单个JAR文件来运行它:
java -classpath target/test1-assembly-1.0-SNAPSHOT.jar example.InsertDataIntoDatabase

但是它失败了,显示如下信息:

没有找到适合的驱动程序,用于jdbc:mysql://localhost:3306/test

我的第一个想法是sbt-assembly可能错过了mysql驱动程序依赖,但我解压了jar文件,并在其中找到了com/mysql/jdbc/Driver.class。

它可能缺少其他的依赖吗?

如何解决这个问题?

2个回答

3

在使用 sbt-assembly 插件打包应用程序时,我遇到了这个问题。在我的情况下,问题出在组合过程中丢失了 META-INF/services/java.sql.Driver 文件。因此,我需要更改组合配置使该文件保持原位:

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs@_*) =>
    xs.map(_.toLowerCase) match {
      case ("manifest.mf" :: Nil) |
           ("index.list" :: Nil) |
           ("dependencies" :: Nil) |
           ("license" :: Nil) |
           ("notice" :: Nil) => MergeStrategy.discard
      case _ => MergeStrategy.first // was 'discard' previousely
    }
  case "reference.conf" => MergeStrategy.concat
  case _ => MergeStrategy.first
}

0
可以给一个初始化代码的例子吗?
JDBC 驱动通常需要加载驱动程序类来调用静态初始化代码并在 DriverManager 中进行注册。对于 MySQL,可以使用以下方式完成:
Class.forName("com.mysql.jdbc.Driver")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接