NoClassDefFoundError soleil/io/ByteToCharConverter avec InterBase pilote JDBC
Avec InterClient 7.5.1 et 8.1.5, la création d'une nouvelle connexion JDBC Java 8 échoue avec
java.lang.NoClassDefFoundError: sun/io/ByteToCharConverter
Cette classe semble être référencés ou utilisé par le InterClient JDBC de la bibliothèque.
L'erreur ne se produit pas avec Java 7. Est-il un moyen pour contourner cette erreur?
Ce code reproduit le problème sur 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);
}
}
}
De sortie:
Exception in thread "main" java.lang.NoClassDefFoundError:
soleil/io/ByteToCharConverter à
interbase.interclient.Connexion.se connecter(Unknown Source) at
interbase.interclient.Connexion.(Source inconnue) à
interbase.interclient.Le pilote.se connecter(Unknown Source) at
java.sql.DriverManager.getConnection(DriverManager.java:664) à
java.sql.DriverManager.getConnection(DriverManager.java:247) à
com.exemple.so25365952.Principal.principale(Main.java:14) Causés par:
java.lang.ClassNotFoundException: le soleil.io.ByteToCharConverter à
java.net.URLClassLoader$1.exécuter(URLClassLoader.java:372) à
java.net.URLClassLoader$1.exécuter(URLClassLoader.java:361) à
java.de sécurité.AccessController.doPrivileged(Native method) at
java.net.URLClassLoader.findClass(URLClassLoader.java:360) à
java.lang.Chargeur de classe.loadClass(ClassLoader.java:424) à
soleil.misc.Lanceur$AppClassLoader.loadClass(Lanceur.java:308) à
java.lang.Chargeur de classe.loadClass(ClassLoader.java:357) ... 6 plus
- Avez-vous d'inclure ces bibliothèques dans votre déploiement ou sont-ils un module séparé? Le
sun.jdk
module contient lessun/io
chemins. - Quelle version de sql jdbc pot que vous utilisez?
- essayé avec InterClient versions 7.5.1 et 8.1.5. Suggérez-vous que nous devrions essayer une nouvelle InterClient version?
- Vous êtes en train de dire que vous n'avez même pas essayé la dernière version du pilote? Ça aurait été la première chose à essayer.
- Connexes: interbase.interclient.UnlicensedComponentException avec la dernière interclient.jar IB (v7.5.80), j'ai vérifié que notre InterBase 7.5.1 sera la cause de ce côté client d'exception avec la version la plus récente de la InterBase pilote JDBC (XE7)
- la dernière version a un autre problème: il refuse de se connecter à d'anciennes versions du serveur. Je n'ai pas essayé plus tôt parce que je soupçonne quelque chose comme ça arriverait 🙂
Vous devez vous connecter pour publier un commentaire.
Le soleil.* et sunw.* les paquets sont internes et ne doit pas être utilisé pour la même raison. Semble comme quelqu'un au InterClient vissé vers le haut. Je vous conseille de les contacter avec un rapport de bug, donc ils savent de résoudre ce problème pour les futures versions.
Si vous ne pouvez pas attendre pour une version future, et sont prêts à rompre avec certaines licences (que je ne recommande pas de cours). Vous pouvez être en mesure de créer votre propre soleil.io.ByteToCharConverter en copiant le code de ici, et les ajouter dans le fichier de bootstrap classpath avec
-Xbootclasspath
, mais que serait un dernier recours.utilisation db2jcc4.jar qui est la version la plus récente. si vous avez changé votre esprit pour utiliser Java8 vous avez besoin pour utiliser cela.
J'ai le similirar problème et ce changement m'aider à corriger l'erreur.
sun.io.ByteToCharConvertor
a été dépréciée en java 7. et il semble qu'ils le supprimer dans java 8.La réponse à la question interbase.interclient.UnlicensedComponentException avec la dernière interclient.jar IB (v7.5.80) semble fonctionner pour moi aussi. Il suggère d'utiliser la version 1.5 du pilote JDBC pour Firebird. Heureusement, ce pilote ne reposent pas sur des obsolète soleil des classes et travaille avec le JRE 8.
C'est une vieille question, mais dans le cas où cette aide à quelqu'un:
Trouver la Java 7 rt.jar dans le dossier lib.
Ouvrez le fichier et allez dans le dossier de soleil/io.
Trouver le Java 8 rt.jar dans le dossier lib.
Ouvrez le fichier et allez dans le dossier de soleil/io.
Déplacer tous les .les fichiers de classe dans le dossier de soleil/io à partir de Java 7 pour le Java 8 de soleil/io dossier, à l'exception Win32ErrorMode.class (cette classe a été dans les deux fichiers jar).
Enregistrer le Java 8 rt.jar avec l'ajout de classes.
Cela a fonctionné pour moi, à l'aide d'un ancien pilote jdbc SQL Server pour SQL Server.
Je suis d'accord avec Sergio, c'est maintenant même plus la question! 🙂 Mais à mon lieu de travail, aussi, malheureusement, nous ne sommes que de 2018, pour diverses raisons, toujours à l'aide d'un super-vieux Interbase (v9, 2009). Donc à un certain point, que j'étais trop dans l'impossibilité de continuer à utiliser le interclient.jar emballé avec IBv9, parce que j'aimerais recevoir ce même soleil.io.ByteToCharConverter erreur. Pas de doute, c'était parce que le Java sur mon ordinateur client était donc bien plus maintenant. Après tout, il est 9 ans plus tard. Mais je ne veux pas dans mon cas, pour aller avec la solution de l'installation d'un héritage Java sur ma machine, comme il a travaillé pour les autres.
Donc comme une solution, sur mon ordinateur client (Linux/Debian x64), j'ai installé Interbase 2017, au plus tard à l'époque(*). Mais lors de l'installation, j'ai installé l'IB Client (pas de Serveur + Client). L' /opt/interbase/lib/interclient.jar qui est emballé avec l'IB 2017 client fonctionne très bien maintenant (pas de soleil.io erreur). Et oui, c'IB 2017 (v13) interclient.jar fonctionne très bien à se connecter à notre ancien IB serveur 2009.
(Je dois le remettre à Embarcadero: Ils sont toujours le "soutien" d'être en mesure de se connecter à des versions plus anciennes, tout au moins dans leur interclient.jar et libgds.donc. Cela fait sens aussi utile bien sûr, pour ceux administrateurs système qui souhaitent migrer à partir des systèmes plus anciens aux plus récents.)
( * ), Vous pouvez obtenir un version d'essai gratuite de Interbase d'embarcadero. Aussi loin que je peux dire, cependant, lorsque vous l'installez, si vous installez le Client et l'utilisation de la interclient.jar cela ne nécessite pas de licence. Seulement l'installation de l'IB serveur (et selon le nombre d'utilisateurs/de connexions, etc) mais ce n'est rien de nouveau pour l'IB utilisateurs/administrateurs.
Travaille pour nous, au moins, jusqu'à ce que nous mettons à jour notre serveur IB version, ou de se déplacer vers Firebird.
Espère que cela aide au moins une autre personne là-bas.
utilisation
remplacer
peut Résoudre le problème