Error: Could not initialize class ru.yandex.clickhouse.ClickHouseUtil

Error: Could not initialize class ru.yandex.clickhouse.ClickHouseUtil

我在 java 应用程序中使用 clickhouse-jdbc。我将它添加到 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: Could not initialize class ru.yandex.clickhouse.ClickHouseUtil

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

错误 'Could not initialize class ....' 表示 JVM 已经尝试执行提到的 class 的静态初始化但失败。

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

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

另外值得指出的是异常信息'Could not initialize class ....'意味着静态初始化已经已经失败了。也就是说,当抛出这个异常时,至少是JVM第二次加载class失败。当 JVM 首次加载此 class 失败时,您的应用程序可能报告了一条信息更丰富的错误消息。