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, и это изменение поможет мне исправить ошибку.


sun.io.ByteToCharConvertor был устаревшим в java 7. и, похоже, они удаляют его в java 8.


ответ на вопрос в 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.

надеюсь, это поможет хотя бы одному другому человеку.