java - 尝试通过 scala/spark 应用程序连接到 postgres 数据库时出现 ClassNotFoundException
问题描述
我需要通过 scala/spark 应用程序连接到 postgres 数据库。当我在我的 IDE 中运行它时它工作得很好但是,当我尝试使用此命令运行打包的可执行 jar 时,我收到以下日志消息:
使用以下命令触发可执行 jar:
java -cp HighestPerformingCampaign-assembly-1.0.jar com.scala.Executor
抛出异常:
Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: jdbc. Please find packages at http://spark.apache.org/third-party-projects.html
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:689)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSourceV2(DataSource.scala:743)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:266)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:226)
at com.scala.Executor$.findHighestCampaign(Executor.scala:31)
at com.scala.Executor$.main(Executor.scala:15)
at com.scala.Executor.main(Executor.scala)
Caused by: java.lang.ClassNotFoundException: jdbc.DefaultSource
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at org.apache.spark.sql.execution.datasources.DataSource$.$anonfun$lookupDataSource$5(DataSource.scala:663)
at scala.util.Try$.apply(Try.scala:213)
at org.apache.spark.sql.execution.datasources.DataSo`enter code here`urce$.$anonfun$lookupDataSource$4(DataSource.scala:663)
at scala.util.Failure.orElse(Try.scala:224)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:663)
... 6 more
我的 build.sbt 文件设置如下:
name := "HighestPerformingCampaign"
version := "1.0"
crossScalaVersions := Seq("2.11.12", "2.12.12")
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.1.1"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.1.1"
libraryDependencies += "org.postgresql" % "postgresql" % "9.3-1102-jdbc41"
mainClass := Some("com.scala.Executor")
assemblyJarName in assembly := "HighestPerformingCampaign-assembly-1.0.jar"
我正在使用存储在项目文件夹下的 sbt-assembly 插件来生成 jar:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")
有什么我在这里遗漏的东西阻止了驱动程序被添加到打包的 jar 中吗?我的连接详细信息也指定如下:
val df = spark
.sqlContext
.read
.format("jdbc")
.option("url", "jdbc:postgresql:postgres")
.option("user", "postgres")
.option("password", "postgres")
.option("query", query)
.load()
解决方案
您可以使用 . 检查您的 jar 是否具有所需的类jar -tf HighestPerformingCampaign-assembly-1.0.jar
。如果它不包含所需的类jdbc.DefaultSource
(应该是这种情况),则意味着胖/打包的 jar 没有按预期构建。我建议不要创建这个胖 jar,您可以Artifacts
从 IDE(在 Intellij 中它位于Project Settings -> Artifacts
)创建,这基本上是创建所有依赖 jar 并将其放在某个 Artifacts 根目录下,然后将此目录的路径提供给 java命令之类的java -cp HighestPerformingCampaign-assembly-1.0.jar:<absolute path to artifact root> com.scala.Executor
推荐阅读
- python - 循环遍历非 None 和非空目录
- database - Sonarqube - 非常大的数据库
- c# - 如何在 C# 中为未处理的异常全局应用异常(应用程序是 WPF、Winforms 和类库项目的组合)
- java - Tomcat 日志记录属性过滤
- github - 从 github 获取最新的 pkg
- java - Java 使用嵌套的 for 循环打印模式
- c++ - GCC编译器空值错误
- c# - 无法使用 Galasoft MVVM 显示 TreeView 项目
- android - Firebase Query - 如何按单独的字段排序?
- java - 我不能使用 HttpServlet TT