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

时间:2014-08-18 14:38:06

标签: java jdbc java-8 interbase

使用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:   sun / io / ByteToCharConverter at   interbase.interclient.Connection.connect(未知来源)at   interbase.interclient.Connection。(未知来源)at   interbase.interclient.Driver.connect(未知来源)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 at   java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 6更多

7 个答案:

答案 0 :(得分:6)

太阳。*和sunw。*包是内部的,不应该用于这个原因。好像InterClient的某个人搞砸了。我建议您通过错误报告与他们联系,以便他们知道为将来的版本修复此问题。

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分: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。

答案 5 :(得分: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(v13)interclient.jar可以很好地连接到我们的旧IB 2009服务器。

(我必须把它交给Embarcadero:他们仍然在“支持”能够连接到较旧的版本-至少在他们的interclient.jar和libgds.so中。这对于那些对希望从较旧的系统迁移到较新的系统。)

(*)您可以获得free trial version of Interbase from embarcadero。据我所知,但是,在安装时,如果仅安装客户端并使用interclient.jar,则不需要许可证。仅安装IB服务器(并取决于用户/连接数等),但这对IB用户/管理员而言并不新鲜。

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

希望这可以帮助至少一个其他人。

答案 6 :(得分:0)

使用

Validator.extend('vat', {
  getMessage: field => 'The ' + field + ' is invalid.',
  validate: async (value) => {
    let countryCode = value.substr(0, 2)
    let number = value.substr(2, value.length - 2)
    try {
        const {status, data} = await axios.post('/api/euvat', {countryCode: countryCode, vatNumber: number})
        return status === 200 ? data.success : false
    } catch (e) {
        return false
    }
  },
}, {immediate: false})

替换

<!-- https://mvnrepository.com/artifact/com.ibm.db2.jcc/db2jcc -->
        <dependency>
            <groupId>com.ibm.db2.jcc</groupId>
            <artifactId>db2jcc</artifactId>
            <version>db2jcc4</version>
        </dependency>

可以解决问题