从单个 jar 运行时找不到适用于 jdbc:postgresql 的驱动程序

问题描述 投票:0回答:1

我有一个 Scala 项目,它将信息获取到 postgress 数据库。我在 Intellij 中使用 sbt 设置了该项目。我使用 sbt 插件 sbt-assemble 创建一个包含依赖 jar 中我需要的所有类的单个 jar。我可以从 Intellij 运行该程序,没有任何问题。

但是如果我从 sbt-assemble 构建的单个 jar 运行它:

java -jar /opt/service/sample.jar

但失败并出现错误:

线程“主”java.sql.SQLException中出现异常:java.sql.SQLException:没有找到适合jdbc的驱动程序:postgresql://

我解压了 fat Sample.jar,搜索了 postgress jar,但没有找到。 sbt-assemble 可能错过了 mysql 驱动程序依赖项。

这是我的 build.sbt 汇编代码。

ThisBuild / libraryDependencies ++= Seq(
  "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2",
  "org.postgresql" % "postgresql" % "42.2.14"
)

import sbtassembly.MergeStrategy
assemblyMergeStrategy in assembly := {
  case PathList("org", "apache", xs @ _*) => MergeStrategy.first
  case PathList("org", "slf4j", xs @ _*) => MergeStrategy.first
  case PathList("org", "aopalliance", xs @ _*) => MergeStrategy.first
  case PathList("jersey", "repackaged", xs @ _*) => MergeStrategy.first
  case PathList("javax", xs @ _*) => MergeStrategy.first
  case PathList("io", "netty", xs @ _*) => MergeStrategy.first
  case PathList("com", "amazonaws", xs @ _*) => MergeStrategy.first
  case PathList("META-INF", xs @ _*) =>
    (xs map {_.toLowerCase}) match {
      case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) => MergeStrategy.discard
      case _ => MergeStrategy.first
    }
  case PathList("com", "sun", xs @ _*) => MergeStrategy.first
  case PathList("git.properties", xs @ _*) => MergeStrategy.first
  case PathList("mozilla", xs @ _*) => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

我还需要对 build.sbt 中的上述代码做一些其他更改吗?

尝试在本地使用命令运行 Jar 并运行。

java -cp sampl.jar:/Users/x/.m2/repository/org/postgresql/postgresql/42.2.7/postgresql-42.2.7.jar com.abc.main

因此,请建议对 sbt 程序集进行更改,这样可以运行 fat jar,而无需在运行命令中提供额外的 jar

scala sbt executable-jar sbt-assembly
1个回答
0
投票
ThisBuild / libraryDependencies ++= Seq(
  "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2",
  "org.postgresql" % "postgresql" % "42.2.14"
)

您是否正在使用任何其他与数据库相关的依赖项,例如 Oracle 或 MySQL?如果是这种情况,您需要更新代码以在创建连接时加载 Postgres 驱动程序。

Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection(url, user, password);

或者只是删除不必要的 sql 依赖项。这应该可以解决问题。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.