【问题标题】:No suitable driver found for jdbc:mysql when running from single jar从单个 jar 运行时找不到适合 jdbc:mysql 的驱动程序
【发布时间】:2023-03-05 12:56:01
【问题描述】:

我有一个 Scala 测试项目,它将一些信息写入 mysql 数据库。我使用 sbt 设置项目,并使用 sbt-eclipsify 以便可以从 Eclipse 运行它。我还使用 sbt 插件 sbt-assembly 创建了一个 jar,其中包含我需要的所有依赖 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。

是否还有其他可能缺少的依赖项?

如何解决?

【问题讨论】:

    标签: mysql scala sbt


    【解决方案1】:

    我在使用sbt-assembly 插件“uberjar”我的应用程序时遇到了这个问题。就我而言,问题在于在组装过程中丢失了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
    }
    

    【讨论】:

      【解决方案2】:

      你能举一个初始化代码的例子吗?

      JDBC驱动通常需要加载驱动类来调用静态初始化代码并注册到DriverManager中。对于 MySQL,这可以通过以下方式完成:

      Class.forName("com.mysql.jdbc.Driver")
      

      【讨论】:

        猜你喜欢
        • 2016-11-28
        • 2015-10-02
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 2018-12-13
        • 2015-09-22
        相关资源
        最近更新 更多