如何在Apache Ignite中修复“Could not initialize class org.apache.ignite.IgniteJdbcThinDriver”错误?

5

问题

我试图使用Apache Ignite内置工具SQLLine连接到Apache Ignite服务器。但是出现错误:java.lang.NoClassDefFoundError: Could not initialize class org.apache.ignite.IgniteJdbcThinDriver

背景

我在一个容器中运行Apache Ignite,另一个容器中运行CentOS7。两个容器都在同一网络中(ping命令可以互通)。连接尝试是从CentOS7到Apache Ignite的。

Apache Ignite似乎只用默认配置就可以正常运行。在CentOS7容器中,我安装了Oracle JDK 12.0.1,并在一个文件夹中放置了Apache Ignite 2.7.0二进制文件。我还设置了IGNITE_HOME环境变量。

在这里(https://apacheignite-sql.readme.io/docs/sqlline),它说我可以只使用以下命令连接到我的集群:./sqlline.sh --verbose=true -u jdbc:ignite:thin://127.0.0.1/。然而,这会抛出前面提到的错误。

SQLLine应该附带Ignite JDBC驱动程序。我已经尝试手动下载它们(https://apacheignite-sql.readme.io/docs/jdbc-driver#section-multiple-endpoints)。当我下载驱动程序(据说是ignite-core-{version}.jar)时,将其放置在与sqlline.jar文件相同的文件夹中。

输出

[root@bc72c4fbf47e bin]# ./sqlline.sh
sqlline version 1.3.0
sqlline> !connect jdbc:ignite:thin://172.19.0.2/
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.ignite.internal.util.GridUnsafe$2 (file:/var/tmp/apache-ignite/libs/ignite-core-2.7.0.jar) to field java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of org.apache.ignite.internal.util.GridUnsafe$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
java.lang.NoClassDefFoundError: Could not initialize class org.apache.ignite.IgniteJdbcThinDriver
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:415)
    at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:555)
    at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:547)
    at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:449)
    at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:426)
    at sqlline.SqlLine.findRegisteredDriver(SqlLine.java:1568)
    at sqlline.SqlLine.scanForDriver(SqlLine.java:1542)
    at sqlline.Commands.connect(Commands.java:1074)
    at sqlline.Commands.connect(Commands.java:1001)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at sqlline.ReflectiveCommandHandler.execute(ReflectiveCommandHandler.java:38)
    at sqlline.SqlLine.dispatch(SqlLine.java:791)
    at sqlline.SqlLine.begin(SqlLine.java:668)
    at sqlline.SqlLine.start(SqlLine.java:373)
    at sqlline.SqlLine.main(SqlLine.java:265)

结论

我应该能够使用!connect jdbc:ignite:thin://172.19.0.2/命令在sqlline中连接到我的Ignite服务器。 但是这并不起作用,并抛出Could not initialize class org.apache.ignite.IgniteJdbcThinDriver的错误信息。 IgniteJDBCThinDriver已被安装/可用。

4个回答

7

添加JVM参数

--add-opens java.base/java.nio=ALL-UNNAMED

这个解决方案对我很有帮助。


4

推荐使用Java 8,因为Apache Ignite 2.7.0不完全支持Java 12。否则,您可以尝试调整JVM选项


1

谢谢 @alamar,那个方法有效!

我卸载了使用RPM安装的JDK12。 检查包名: rpm -qa | grep jdk. 删除包: rpm -e jdk-12.0.1-12.0.1-ga.x86_64.

我正在使用一个隔离的系统,所以我从另一台机器下载并传输了JDK8.rpm。 安装JDK8: rpm -ihv jdk-8u211-linux-x64.rpm.

现在当我运行: ./sqlline.sh --verbose=true -u jdbc:ignite:thin://172.19.0.2, 我得到: issuing: !connect jdbc:ignite:thin://172.19.0.2/ '' '' org.apache.ignite.IgniteJdbcTh Connecting to jdbc:ignite:thin://172.19.0.2/ Connected to: Apache Ignite (version 2.7.0#20181130-sha1:256ae401) Driver: Apache Ignite Thin JDBC Driver (version 2.7.0#20181130-sha1:256ae401) Autocommit status: true Transaction isolation: TRANSACTION_REPEATABLE_READ sqlline version 1.3.0.

我现在可以查询我的数据库。


0

我在以下非常奇怪的情况下遇到了这个错误:

我的Maven Java项目的一个依赖项有Apache-Ignite作为依赖项。当我打开到无效路径的SQLite数据库连接时(例如,./result/r.sqlite,其中文件夹./result不存在),就会发生此错误(使用th驱动程序org.xerial.sqlite-jdbc:v3.30.1.)。因此,这个调用

Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:result.sqlite")

会导致这个堆栈跟踪:

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.apache.ignite.IgniteJdbcThinDriver
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:555)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:674)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)
    at MyClass.myMethod(MyClass.java:154)

所以解决方案显然是要确保在应该创建sqlite数据库的文件夹存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接