【问题标题】:after packaging and running app I get java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver打包并运行应用程序后,我得到 java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver
【发布时间】:2017-08-10 20:01:29
【问题描述】:

当我尝试在 IDEA 中运行代码时,我没有收到此错误,但是在我将其打包并尝试使用

运行 jar 之后
java -cp app.jar com.hive.connect.controller.RecordController

我得到了这个异常。

java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver

我的专家

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.1</version>
    </dependency>
  </dependencies>

我的代码

public class RecordController {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";

public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName(driverName);
    Connection con = DriverManager
                       .getConnection("jdbc:hive2://host:port/db;" +
                                        "principal=principal");
    Statement stmt = con.createStatement();
    String tableName = "evkuzmin_testHiveDriverTable";
    stmt.execute("drop table if exists " + tableName);
    stmt.execute("create table " + tableName + " (key int, value string)");
  }
}

为什么会这样?

编辑 完全错误

Exception in thread "main" java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:190)
        at com.hive.connect.controller.RecordController.main(RecordController.java:18)

【问题讨论】:

  • 您指定-cp app.jar,这意味着它的所有依赖项都不在当前类路径上。
  • @Mark 感谢您指出这一点。在这里检查了如何使用依赖项制作 jar stackoverflow.com/questions/1729054/…
  • 这可能是一种非常脆弱的方法,尤其是对于可能存在于多个依赖项中的资源(例如服务提供者定义);您可能希望包含 ClassNotFoundException 的完整堆栈跟踪
  • @Mark Brittle 怎么样?添加了完整的错误。

标签: java maven hadoop jdbc hive


【解决方案1】:

试试这样:

"%JAVA_HOME%\bin\java.exe" -cp  "%~dp0\hive-jdbc.jar;%~dp0\app.jar" com.hive.connect.controller.RecordController

而不是这个:

java -cp app.jar com.hive.connect.controller.RecordController

该错误是由于在尝试运行 Java 代码(进而尝试加载 Hive JDBC jar)时 Hive JDBC jar 不可用

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    1-如果你使用的是maven,你必须在pom.xml文件中添加这个

    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>0.8.1</version>
    </dependency>
    

    2.或者你可以下载上面提到的jar。

    • 将 jar 放入 hive/install location/of/lib 目录...

    这总是正常工作。

    【讨论】:

    • 我有 hive-jdbc 依赖。
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2013-08-26
    • 2017-08-06
    • 2021-11-06
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多