IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Chargement dynamique de jar


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 116
    Par défaut Chargement dynamique de jar
    Bonjour,

    J’utilise le code suivant pour charger dynamiquement un Jar, dans mon cas un pilote JDBC.
    Le code marche, mais c’est en partie du copier-coller.
    Je suis un peu au-dessus de mes pompes.

    Par exemple il y a beaucoup d’exception.
    Je me demande lesquels sont vraiment à gérer, a part celles liées aux fichiers.

    En plus ça marche sauf avec Oracle.
    Dans ce cas je dois faire un Class.forname à la main.
    Il y a-t-il un moyen de savoir, si le pilote n’est pas déclaré dans le classpath.
    Et éventuellement de demander à l’utilisateur de le faire à la main.

    Cela ne lève pas d’erreur.
    Seulement quand je fait mon appel à la couche JDBC.
    Mais ça pourrait venir d’ailleurs, alors je dois détecter avant de l’utiliser.

    Je ne peux pas faire quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(oracle… {
    	Class.forname(}
    Cordialement et merci pour votre aide
    Fabrice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    	public boolean loadDriver(String pathDriver) {
    		boolean success = false;
    		File file = new File(pathDriver);
     
    		try {
    			URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader
    					.getSystemClassLoader();
    			URL url = file.toURI().toURL();
    			Method addURL = URLClassLoader.class.getDeclaredMethod("addURL",
    					new Class<?>[] { URL.class });
    			addURL.setAccessible(true);
    			addURL.invoke(systemClassLoader, new Object[] { url });
     
    			success = true;
    		} catch (MalformedURLException e) {
    			e.printStackTrace();
    		} catch (NoSuchMethodException e) {
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			e.printStackTrace();
    		}
    		return success;
    	}
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ce code est une tentative foireuse d'essayer d'injecter un jar supplémentaire dans le classloader systeme qui n'existe pas nécessairement (tiens donc, pas de test sur ce null?), d'appeler aveuglément une méthode addUrl qui n'existe pas nécessairement et de prier pour que ça lise le META-INF/


    Laisse tomber. C'est quoi ton but, pourquoi le driver doit être ajouté après démarrage? Qui va utiliser ce driver après?

  3. #3
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 116
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ce code est une tentative foireuse d'essayer d'injecter un jar supplémentaire dans le classloader systeme qui n'existe pas nécessairement (tiens donc, pas de test sur ce null?), d'appeler aveuglément une méthode addUrl qui n'existe pas
    aveuglément c'est tout moi.
    Le problème j'ai du mal à cerner les testes à faire
    Je veux juste m'assurer, que le fichier est un jar ou qu'il existe
    Qu'il a bien été chargé et ajouté au classpath

    nécessairement et de prier pour que ça lise le META-INF/

    Justement ça ne marche pas avec Oracle


    Je te trouve un peu dur
    Il y a pas beaucoup de documentation sur le sujet.

    Pourquoi je fais ça ?
    En fait j'ai du me faire mon propre client SQL, car ceux du marché ne sont pas top niveau accessibilité.

    Entre autre j'affiche mes résultats sous forme de HTML plutôt que sous forme de JTable.

    Donc je veux utiliser plusieurs base de données, et pour ça je charge le Jar en fonction de la base que je veux attaquer.
    Et en plus j'ai des ancienne versions de serveurs à utiliser, qui me sont imposées. Donc je dois bien choisir mon pilote selon le cas.
    Ca marche avec MySql, HsqlDb et PostgreSQL

    Mon plus gros problème c'est que j'ai pas l'habitude de travailler avec cette partie de Java
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    L'option la plus simple c'est de démarrer directement avec tous les drivers dont tu as besoin dans le classpath dès le départ.

    L'option plus compliquée, c'est de le charger via un URLClassLoader bien propre. Utiliser ServiceLoader pour charger le driver et l'enregistrer, puis lancer la connection en utilisant le classloader

    Un truc de ce genre pour enregistrer le driver

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cl = new URLClassLoader(new URL[]{file.toURI().toURL()};
    SeviceLoader.load(Driver.class,cl);
    //tiré du code de DriverManager pour le chargement initial
    Iterator<Driver> driversIterator = loadedDrivers.iterator();
    while(driversIterator.hasNext()) {
        driversIterator.next(); //equivalent du Class.forName sur le driver
    }
    Un truc de ce genre pour l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread.currentThread().setContextClassLoader(cl); // prendre le classloader du driver.
    DriverManager.getConnection(... connection utilisant le nouveau driver...);

  5. #5
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    A noter que depuis Java6, vous n'avez plus besoin de déclarer un Class.forName à partir du moment où le jar du driver contient le système JDBC 4.0, grâce au système du ServiceProvider

    http://docs.oracle.com/javase/6/docs...erManager.html
    JDBC 4.0 Drivers must include the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC drivers implementation of java.sql.Driver. For example, to load the my.sql.Driver class, the META-INF/services/java.sql.Driver file would contain the entry:

    my.sql.Driver

    Applications no longer need to explictly load JDBC drivers using Class.forName(). Existing programs which currently load JDBC drivers using Class.forName() will continue to work without modification.
    Si le driver est compatible JDBC 4.0 (s'il possède un fichier java.sql.Driver dans un sous répertoire META-INF/services), vous avez juste besoin de l'avoir dans le classpath


    Pour l'utiliser, vous pouvez avoir des jar pour n'importe quelle base de données, le système reconnaîtra celle que vous voulez attaquer grâce à l'URL de connexion dans la méthode getConnection

  6. #6
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 116
    Par défaut
    plus besoin de déclarer un Class.forName à partir du moment où le jar du driver contient le système JDBC 4.0, grâce au système du ServiceProvider


    Justement j'ai l'impression que le pilote d'Oracle ne le déclare pas.
    De tout façon je dois revoir ma copie en profondeur.
    Je vais me servir de vos indications.
    Et je reposterai ma version.

    Merci à vous deux
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

Discussions similaires

  1. Chargement dynamiquement Jar JDBC
    Par matla dans le forum JDBC
    Réponses: 6
    Dernier message: 14/11/2008, 14h55
  2. Chargement dynamique de Jar
    Par elskwi dans le forum Langage
    Réponses: 1
    Dernier message: 17/04/2008, 15h20
  3. chargement dynamique d'un autre jar
    Par Serik dans le forum Applets
    Réponses: 2
    Dernier message: 19/07/2007, 22h10
  4. Chargement dynamique d'une archive.jar
    Par cfrayer dans le forum Langage
    Réponses: 5
    Dernier message: 29/08/2006, 16h00
  5. [jar]chargement dynamique.
    Par Teddy-htk dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 27/04/2006, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo