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

使用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中的exception:sun / io / ByteToCharConverter,interbase.interclient.Connection.connect(未知源),interbase.interclient.Connection。(未知来源)interbase.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..LLC.Lacuncher的$ java.net.URLClassLoader.findClass(URLClassLoader.java:360)中的AccessController.doPrivileged(本机方法),位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)$ AppClassLoader.loadClass(Launcher。 java:308)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)… 6更多

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

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

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

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

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

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

在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。

我同意塞尔吉奥,现在这是一个更老的问题! :-)但是,在我的工作场所,我们不幸的是,截至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中。这对于那些想要迁移的系统管理员来说当然有用从旧系统到新系统。)

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

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

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