0

我正在使用com.github.johnrengelman.shadowshadowJar Gradle 插件提供的 Gradle 目标来构建应用程序,这需要使用 Impala 连接到 Kudu。org.apache.hive.jdbc.HiveDriver

问题是当我使用标准方法在 Scala 中导入驱动程序时:

Class.forName("org.apache.hive.jdbc.HiveDriver")
  • shadow 插件将其从生成的 JAR 中删除,这意味着运行时错误:
    • java.lang.ClassNotFoundException: org.apache.hadoop.hive.jdbc.HiveDriver.

我的build.gradle包含:

dependencies {
  implementation {
    "org.apache.hive:hive-jdbc:1.2.1"
  }
}

如何指示影子插件不要删除通过字符串注入的所需依赖项?

4

1 回答 1

0

我发现解决方案是不包含静态类型 via Class.forName,而是通过导入来使用代码:

import java.sql.DriverManager
import org.apache.hive.jdbc.{HiveConnection, HiveDriver}

class Foo {

  // Register Hive Driver this way to prevent shadowing to cut it off
  new HiveDriver()

  DriverManager.getConnection(connectionUrl, user, password) match {
    case connection: HiveConnection =>
       ...
  }
}

这样,影子插件就会被正式告知实际上需要驱动程序这一事实。

于 2020-10-27T20:31:59.833 回答