具有InterBase JDBC驱动程序的NoClassDefFoundError sun / io / ByteToCharConverter

问题描述 投票:7回答:6

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

输出:

线程“main”中的异常java.lang.NoClassDefFoundError:interbase.interclient.Connection.connect中的interbase.interclient.Connection.connect(未知源)中的sun / io / ByteToCharConverter。(interknown.interclient.Driver.connect中的未知源)(未知来源)来自java.sql.DriverManager.getConnection(DriverManager.java:664)的java.sql.DriverManager.getConnection(DriverManager.java:247)at com.example.so25365952.Main.main(Main.java:14) by:java.lang.ClassNotFoundException:位于java.net.URLClassLoader $ 1.run(URLClassLoader.java:372)的sun.io.ByteToCharConverter,位于java.security的java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)。位于java..L.Tisc.Launcher的java.lang.ClassLoader.loadClass(ClassLoader.java:424)java.net.URLClassLoader.findClass(URLClassLoader.java:360)的AccessController.doPrivileged(Native Method)$ AppClassLoader.loadClass(Launcher。 java:308)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 6更多

java jdbc java-8 interbase
6个回答
6
投票

sun。*和sunw。*包是内部的,不应该用于这个原因。好像InterClient的某个人搞砸了。我建议你用错误报告联系他们,这样他们就会知道为将来的版本修复这个问题。

如果您不能等待将来的版本,并且愿意打破一些许可证(当然我不推荐)。您可以通过复制here中的代码并使用-Xbootclasspath将其添加到bootstrap类路径来创建自己的sun.io.ByteToCharConverter,但这将是最后的手段。


4
投票

使用db2jcc4.jar这是最新版本。如果你改变主意使用Java8,你需要使用它。我有similirar问题,这个更改帮助我修复错误。


2
投票

sun.io.ByteToCharConvertor在java 7中被弃用了。似乎它们在java 8中删除了它。


1
投票

问题interbase.interclient.UnlicensedComponentException with the latest interclient.jar IB (v7.5.80)的答案似乎对我也有用。它建议为Firebird使用1.5版本的JDBC驱动程序。幸运的是,这个驱动程序不依赖于已弃用的sun类并与JRE 8一起使用。


1
投票

这是一个老问题,但如果这有助于某人:

在lib文件夹中找到Java 7 rt.jar。打开文件,然后转到sun / io文件夹。

在lib文件夹中找到Java 8 rt.jar。打开文件,然后转到sun / io文件夹。

将文件夹sun / io中的所有.class文件从Java 7移动到Java 8 sun / io文件夹,Win32ErrorMode.class除外(此类在两个jar文件中)。

使用添加的类保存Java 8 rt.jar。

这对我有用,使用旧的jdbc驱动程序用于SQL Server。


0
投票

我同意塞尔吉奥,这是一个更老的问题! :-)但是在我的工作场所,我们不幸的是,截至2018年,由于各种原因我们仍在使用超级旧的Interbase(v9,2009)。所以在某些时候我也无法继续使用与IBv9打包在一起的interclient.jar,因为我会收到同样的sun.io.ByteToCharConverter错误。毫无疑问,这是因为我的客户机上的Java现在更新了。毕竟,它是9年后。但我不想在我的情况下使用在我的机器上安装遗留Java的解决方案,就像其他人一样。

作为一个解决方案,在我的客户机(Linux / Debian x64)上,我安装了Interbase 2017,这是当时的最新版本(*)。但是在安装时,我只安装了IB客户端(而不是服务器+客户端)。与IB 2017客户端打包在一起的/opt/interbase/lib/interclient.jar现在运行正常(没有sun.io错误)。是的,这个IB 2017(第13版)interclient.jar可以很好地连接到我们旧的IB 2009服务器。

(我必须把它交给Embarcadero:他们仍然'支持'能够连接到旧版本 - 至少在他们的interclient.jar和libgds.so中。这对于那些想要迁移的系统管理员来说当然有用从旧系统到新系统。)

(*)你可以得到一个free trial version of Interbase from embarcadero。但据我所知,当您安装它时,如果仅安装客户端并使用interclient.jar,则不需要许可证。仅安装IB服务器(并且取决于用户/连接的数量等),但这对IB用户/管理员来说并不是什么新鲜事。

至少在我们升级服务器的IB版本或移动到Firebird之前,对我们有用。

希望这有助于至少有一个人在那里。

© www.soinside.com 2019 - 2024. All rights reserved.