【问题标题】:ClassNotFoundException when trying to connect to a postgres database through a scala/spark application尝试通过 scala/spark 应用程序连接到 postgres 数据库时出现 ClassNotFoundException
【发布时间】:2021-08-10 01:46:16
【问题描述】:

我需要通过 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()

【问题讨论】:

    标签: java scala jdbc sbt classnotfoundexception


    【解决方案1】:

    您可以使用jar -tf HighestPerformingCampaign-assembly-1.0.jar 检查您的 jar 是否具有所需的类。如果它不包含所需的类jdbc.DefaultSource(应该是这种情况),则意味着胖/打包的 jar 没有按预期构建。我建议不要创建这个胖 jar,而是可以从 IDE 创建 Artifacts (在 Intellij 中它位于 Project Settings -> Artifacts ),这基本上是创建并将所有依赖的 jar 放在某个 Artifacts 根目录下,然后提供路径将此目录添加到 java 命令中,例如 java -cp HighestPerformingCampaign-assembly-1.0.jar:<absolute path to artifact root> com.scala.Executor

    【讨论】:

    • 我运行 'jar -tf HighestPerformingCampaign-assembly-1.0.jar' 并看到驱动程序类被引用:org/postgresql/Driver$1.class, org/postgresql/Driver$ConnectThread.class, org/ postgresql/Driver.class 但是,我现在不断收到此错误:线程“主”java.sql.SQLException 中的异常:没有合适的驱动程序。我尝试添加 Class.forName("org.postgresql.Driver") 但没有运气。知道如何解决这个问题吗?
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多