NoClassDefFoundError sun/io / ByteToCharConverter с драйвером InterBase JDBC
С InterClient 7.5.1 и 8.1.5, создание нового соединения JDBC в Java 8 терпит неудачу с
java.lang.NoClassDefFoundError: sun/io/ByteToCharConverter
этот класс, по-видимому, ссылается или используется библиотекой InterClient JDBC. Ошибка не возникает с Java 7. Есть ли способ обойти эту ошибку?
этот код воспроизводит проблему на Java 8:
package com.example.so25365952;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
interbase.interclient.Connection conn;
public static void main(String[] args) {
try {
Class.forName("interbase.interclient.Driver");
DriverManager.getConnection("jdbc:interbase://localhost/data/mydb.gdb", "sysdba", "password123");
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
выход:
исключение в потоке" main " java.ленг.Ошибке типа noclassdeffounderror: sun / io / ByteToCharConverter at для Interbase.interclient.Соединение.connect (неизвестный источник) на для Interbase.interclient.Соединение.(Неизвестный источник) на для Interbase.interclient.Водитель.connect (неизвестный источник) на Ява.язык SQL.DriverManager.getConnection (DriverManager.java: 664) at Ява.язык SQL.DriverManager.getConnection (DriverManager.java: 247) at com.пример.so25365952.Главная.главная(Main.java: 14) вызвано: Ява.ленг.ClassNotFoundException: солнце.Ио.ByteToCharConverter at Ява.чистая.Urlclassloader, на$1.запустить(urlclassloader, на.Ява:372) в Ява.чистая.Urlclassloader, на$1.запустить(urlclassloader, на.Ява:361) в Ява.безопасность.AccessController.doPrivileged(родной метод) на Ява.чистая.Urlclassloader, на.findClass(urlclassloader, на.Ява:360) в Ява.ленг.загрузчик классов.loadClass (загрузчик классов.java: 424) at солнце.разное.Launcher$AppClassLoader.loadClass (пусковая установка.java: 308) at Ява.ленг.загрузчик классов.loadClass (загрузчик классов.java: 357)... Более 6
6 ответов
солнце.* и sunw.* пакеты являются внутренними и не должны использоваться именно по этой причине. Похоже, кто-то в InterClient облажался. Я бы посоветовал вам связаться с ними с сообщением об ошибке, чтобы они знали, как исправить это для будущих выпусков.
Если вы не можете ждать будущего выпуска и готовы разорвать некоторые лицензии (которые я, конечно, не рекомендую). Вы можете создать свое собственное солнце.Ио.ByteToCharConverter путем копирования кода из здесь, и добавив это путь к классу bootstrap с -Xbootclasspath
, но это было бы последним средством.
используйте db2jcc4.jar, которая является последней версией. если вы передумали использовать Java8, вам нужно использовать это. У меня есть проблема similirar, и это изменение поможет мне исправить ошибку.
ответ на вопрос в Interbase.interclient.UnlicensedComponentException с последним interclient.jar IB (v7.5.80) похоже на работу для меня. Он предлагает использовать версию 1.5 драйвера JDBC для Firebird. К счастью, этот драйвер не полагается на устаревшие классы sun и работает с JRE 8.
Это старый вопрос, но в случае, если это помогает кому-то:
найти Java 7 rt.jar в папке lib. Откройте файл и перейдите в папку sun / io.
найти Java 8 rt.jar в папке lib. Откройте файл и перейдите в папку sun / io.
переместить все .файлы классов в папке sun/io из Java 7 в папку Java 8 sun / io, за исключением Win32ErrorMode.класс (этот класс был в обоих файлах jar).
сохранить Java 8 rt.jar с добавлены классы.
Это сработало для меня, используя старый драйвер jdbc для SQL Server.
Я согласен с Серхио, это теперь еще более старый вопрос! :- ) Но и на моем рабочем месте мы, к сожалению, по разным причинам по-прежнему используем супер-старую Interbase (v9, 2009). Поэтому в какой-то момент я тоже не смог продолжить использовать interclient.баночка упакована с IBv9, потому что я хотел получить это же самое солнце.Ио.ByteToCharConverter ошибки. Без сомнения, это было потому,что Java на моей клиентской машине была намного новее. Ведь это is 9 лет спустя. Но я не хотите в моем случае пойти с решением установки устаревшей Java на моей машине, как это работало для других.
Итак, в качестве решения на моей клиентской машине (Linux / Debian x64) я установил Interbase 2017, последний в то время (*). Но при установке я установил только клиент IB (а не сервер + клиент). /Opt / interbase/lib / interclient.банка, которая упакована с клиентом IB 2017, теперь работает отлично (нет солнца.ошибка ввода-вывода). И да, это IB 2017 (v13) interclient.банке работает просто отлично подключение к нашему старому серверу IB 2009.
(Я должен передать его Embarcadero: они все еще "поддерживают" возможность подключения к более старым версиям-по крайней мере, в их interclient.Джар и либгдс.Итак. Это имеет смысл, как полезно, конечно, для тех системных администраторов, которые хотят перейти от старых систем к новым.)
(*) можно получить бесплатная пробная версия Interbase от embarcadero. Насколько я могу судить, однако, когда вы устанавливаете его, если вы устанавливаете Только клиент и используйте interclient.Джар, это не требует лицензии. Только установка IB-сервера (и в зависимости от количества пользователей/подключений и т. д.), Но это не ново для пользователей/администраторов IB.
работает для нас, по крайней мере, пока мы не обновим версию IB нашего сервера или не перейдем на Firebird.
надеюсь, это поможет хотя бы одному другому человеку.