我正在尝试使用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)
我应该能够使用sqlline中的!connect jdbc:ignite:thin://172.19.0.2/
命令连接到我的Ignite服务器。
这不起作用,并抛出Could not initialize class org.apache.ignite.IgniteJdbcThinDriver
IgniteJDBCThinDriver已安装/可用。
答案 0 :(得分:1)
建议使用Java 8,因为Apache Ignite 2.7.0没有完整的Java 12支持。否则,您可以尝试tinkering with JVM options。
答案 1 :(得分: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
。
我现在可以查询数据库。
答案 2 :(得分:0)
在以下非常奇怪的情况下出现此错误:
我的maven java项目的依赖项具有Apache-Ignite作为依赖项。当我在无效路径(例如./result/r.sqlite文件夹不存在./result的路径)上打开与SQLite数据库的连接时,便发生了此错误(使用驱动程序org.xerial.sqlite-jdbc:v3.30.1.
),因此此调用< / p>
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数据库的位置。