我有一个 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
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 依赖项。这应该可以解决问题。