Я пытаюсь подключиться к серверу Apache Ignite с помощью встроенного инструмента Apache Ignite, SQLLine. Я получаю сообщение об ошибке: java.lang.NoClassDefFoundError: Could not initialize class org.apache.ignite.IgniteJdbcThinDriver
У меня есть Apache Ignite, работающий в контейнере, и CentOS7, работающий в другом контейнере. Оба контейнера работают в одной сети (пинг работает в обе стороны). Попытка подключения происходит от CentOS7 к Apache Ignite.
Apache Ignite, кажется, работает нормально только с конфигурацией по умолчанию. В контейнере CentOS7 я установил Oracle JDK 12.0.1, и у меня есть бинарные файлы Апач зажечь 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)
Я должен иметь возможность подключиться к моему серверу Ignite с помощью команды !connect jdbc:ignite:thin://172.19.0.2/
в sqlline.
Это не работает и выкидывает Could not initialize class org.apache.ignite.IgniteJdbcThinDriver
IgniteJDBCThinDriver установлен/доступен.
Рекомендуется Java 8, так как Apache Ignite 2.7.0 не имеет полной поддержки Java 12. В противном случае вы можете попробовать возиться с опциями JVM.
Спасибо @alamar, это сработало!
Я удалил JDK12, который я установил с RPM.
Проверьте имя пакета:
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
.
Теперь я могу запросить свою базу данных.
Я получил эту ошибку в следующей очень странной ситуации:
Зависимость моего java-проекта maven имела Apache-Ignite в качестве зависимости. В тот момент, когда я открыл соединение с базой данных SQLite по недопустимому пути (например, ./result/r.sqlite, где папка ./result не существует), возникла эта ошибка (с использованием драйвера 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.