使用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更多
答案 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>
可以解决问题