web-dev-qa-db-ja.com

NoClassDefFoundError Sun / io / ByteToCharConverterとInterBase JDBCドライバ

InterClient 7.5.1および8.1.5では、Java 8での新しいJDBC接続の作成は、

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);
        }
    }
}

出力:

スレッド「メイン」の例外Java.lang.NoClassDefFoundError:Sun/io/ByteToCharConverter at interbase.interclient.Connection.connect(Unknown Source)at interbase.interclient.Connection。(Unknown Source)at interbase.interclient.Driver.connect(Unknownソース)at Java.sql.DriverManager.getConnection(DriverManager.Java:664)at Java.sql.DriverManager.getConnection(DriverManager.Java:247)at com.example.so25365952.Main.main(Main.Java:14)発生作成者:Java.lang.ClassNotFoundException:Sun.io.ByteToCharConverter at Java.net.URLClassLoader $ 1.run(URLClassLoader.Java:372)at Java.net.URLClassLoader $ 1.run(URLClassLoader.Java:361)at Java.security。 AccessController.doPrivileged(Native Method)at Java.net.URLClassLoader.findClass(URLClassLoader.Java:360)at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)at Sun.misc.Launcher $ AppClassLoader.loadClass(Launcher。 Java:308)at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)... 6続き

8
mjn

Sun. *およびsunw。*パッケージは内部パッケージであり、この理由から使用すべきではありません。 InterClientの誰かが失敗したようです。バグレポートを送って彼らに連絡することをお勧めします。そうすれば彼らは将来のリリースのためにこれを修正することがわかるでしょう。

あなたが将来のリリースを待つことができず、いくつかのライセンスを破棄する用意がある場合(もちろん、私はお勧めしません)。 here からコードをコピーして、独自のSun.io.ByteToCharConverterを作成し、それをbootstrap -Xbootclasspath、しかしそれは最後の手段でしょう。

6
Kayaman

最新バージョンのdb2jcc4.jarを使用してください。 Java8を使用するように変更した場合は、これを使用する必要があります。類似の問題があり、この変更によりエラーを修正できます。

5
Vinod Kotha

Sun.io.ByteToCharConvertorはJava 7.で廃止されました。また、Java 8.で削除されたようです。

2
alizelzele

質問への答え interbase.interclient.UnlicensedComponentExceptionと最新のinterclient.jar IB(v7.5.80) も私にとってはうまくいくようです。 Firebird用のJDBCドライバーのバージョン1.5を使用することをお勧めします。幸い、このドライバは非推奨のSunクラスに依存せず、JRE 8で動作します。

1
mjn

これは古い質問ですが、これが誰かを助ける場合に備えて:

LibフォルダーでJava 7 rt.jarを見つけます。ファイルを開き、Sun/ioフォルダーに移動します。

LibフォルダーでJava 8 rt.jarを見つけます。ファイルを開き、Sun/ioフォルダーに移動します。

Win32ErrorMode.classを除いて、Sun/ioフォルダー内のすべての.classファイルをJava 7からJava 8 Sun/ioフォルダーに移動します(このクラスは両方のjarファイルにありました) )。

追加したクラスを含むJava 8 rt.jarを保存します。

これは、SQL Server用の古いjdbcドライバーを使用して動作しました。

1
Sergio

私はセルジオに同意します、これは今ではさらに古い質問です! :-)しかし、私の職場でも、残念なことに、2018年現在、さまざまな理由により、超古いInterbase(v9、2009)を使用しています。そのため、ある時点で、同じSun.io.ByteToCharConverterエラーが発生するため、IBv9にパッケージ化されたinterclient.jarを引き続き使用できなくなりました。間違いなく、これは、クライアントマシンのJavaが今よりずっと新しいためです。結局のところ、です9しかし、私は他の人のために働いていたので、私のマシンにレガシーJavaを私のマシンにインストールすることの解決策と一緒に行きたくありませんでした。

そこで、解決策として、クライアントマシン(Linux/Debian x64)に、当時最新のInterbase 2017をインストールしました(*)。しかし、インストール時には、IBクライアントのみをインストールしました(サーバー+クライアントはインストールしていません)。 IB 2017クライアントに同梱されている/opt/interbase/lib/interclient.jarが問題なく機能するようになりました(Sun.ioエラーなし)。そして、はい、このIB 2017(v13)interclient.jarは、古いIB 2009サーバーへの接続に問題なく機能します。

(私はそれをEmbarcaderoに渡す必要があります:彼らは古いバージョンに接続できることをまだ「サポート」しています-少なくともinterclient.jarとlibgds.soで。これはもちろん、移行したいシステム管理者にとって有用です古いシステムから新しいシステムへ。)

(*) embarcaderoからInterbaseの無料試用版 を入手できます。ただし、私が知る限り、インストール時にクライアントのみをインストールしてinterclient.jarを使用する場合、ライセンスは不要です。 IBサーバーのインストールのみ(およびユーザー/接続の数などに応じて)が、IBユーザー/管理者にとって新しいことではありません。

少なくとも、サーバーのIBバージョンをアップグレードするか、Firebirdに移行するまでは機能します。

これが少なくとも1人の他の人の役に立つことを願って。

0
androclus