1

clickhouse-jdbc在我的java应用程序中使用。我将它添加到pom.xml这样的:

<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.1.34</version>
</dependency>

当我运行我的 java 应用程序时java -jar myapp.jar。它在抛出:

java.lang.NoClassDefFoundError:无法初始化类 ru.yandex.clickhouse.ClickHouseUtil

在我打包的 jar 文件中,还有ClickHouseUtil.class. 我正在使用Intellij Idea包装罐。我该如何解决这个问题?

4

1 回答 1

1

错误'Could not initialize class ....'意味着JVM已经尝试并且未能执行所提到的类的静态初始化。

类的静态初始化涉及为任何static字段分配值并运行任何static { ... }块。有问题的类是ru.yandex.clickhouse.ClickHouseUtil,这个类的静态初始化只包括设置静态最终字段CLICKHOUSE_ESCAPER。这似乎依赖于几个 Guava 逃逸类(com.google.common.escape.Escapercom.google.common.escape.Escapers)。

所以我怀疑这些 Guava 类不在您打包的 JAR 文件中。

还值得指出的是,异常消息“Could not initialize class ....”意味着静态初始化已经失败。换句话说,当这个异常被抛出时,至少是JVM第二次加载类失败了。当 JVM 首次加载此类失败时,您的应用程序可能报告了更多信息性错误消息。

于 2018-01-12T21:54:21.757 回答