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

Langage Java Discussion :

[Jar] Lister les classes d'un Jar


Sujet :

Langage Java

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 823
    Points
    4 823
    Par défaut [Jar] Lister les classes d'un Jar
    Bonjour

    Voici mon problème. Je dispose d'une application dite "core". Dans un des répertoires liés à cette application, je place des fichiers Jar qui me serviront de plugins.
    Jusque là, ça, je détecte bien mes Jar et je les liste.
    Ma question réside au point suivant. Je veux pouvoir lister les classes de ces divers Jars dans le but de les charger dans le ClassLoader de l'application core.
    Or, je dois avouer que j'ai un peu de mal à réaliser ceci
    Quelqu'un pourrait-il me conseiller sur la bonne marche à suivre ?

    @++

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je ne pense pas que rechercher les class dans les jar soit la meilleur solution, car cela t'obligera à charger toutes les class en mémoire...

    Le mieux est d'utiliser la solution du ServiceLoader dont je t'ai parlé dans le précédent sujet : la solution consiste à utiliser dans chaque jar un simple fichier texte contenant le nom des classes implémentant l'interface de ton plugin...

    Ce mécanisme est détaillé ici : http://www.developpez.net/forums/sho...26#post1457326

    Je pense que c'est à la fois la solution la plus propre et la plus simple, et c'est d'ailleurs assez standard (c'est utilisé par Java 6 pour le chargement auto des drivers JDBC).

    a++

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 823
    Points
    4 823
    Par défaut
    Salut Adi

    C'est vrai j'avais déjà lu ce thread.
    Il va falloir en fait mettre à jour ce fichier à chaque modification.
    Mais bon, il est clair que ta solution est "toute prête" mais il me faut encore un peu de réflexion pour que tout soit correct en Java5.
    J'ai encore de quoi réfléchir et pousser mon modèle.

    Merci à toi

    @++

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GLDavid
    Il va falloir en fait mettre à jour ce fichier à chaque modification.
    Tu as un fichier par jar, donc par plugin...

    Je ne pense pas que le nom de la classe représentant tes plugins puisse changer tous les deux jours

    a++

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 823
    Points
    4 823
    Par défaut
    Salut Adi

    Je potasse la solution que tu as donné à Narmataru.
    Donc, si j'ai bien compris, ton fichier META-INF/services/com.machin.truc est localisé dans le Jar du plugin.
    Il va donc me falloir récupérer les entries de mon Jar jusqu'à tomber sur ce fichier pour que la méthode que tu as indiqué fonctionne.
    C'est ça ou je suis complètement à l'ouest ?

    @++

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GLDavid
    Il va donc me falloir récupérer les entries de mon Jar jusqu'à tomber sur ce fichier pour que la méthode que tu as indiqué fonctionne.
    C'est ça ou je suis complètement à l'ouest ?
    Oui c'est cà !

    Mais la récupération de ces fichiers est très simple avec la méthode getResources() du classloader. Le code de la méthode searchServices() de mon message fait exactement cela et retourne la liste des Class<?> trouvé. Il suffit de lui passer le type de classe et le classloader à utiliser.

    a++

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 823
    Points
    4 823
    Par défaut
    OK, merci à toi.
    Juste le temps de me retrousser les manches et j'attaque.

    @++

  8. #8
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 823
    Points
    4 823
    Par défaut
    Salut

    Ce message est remonté pour la question suivante. Sans doute qu'Adi pourra m'aider à moins qu'une autre âme charitable ne se présente.
    Présentement, j'ai implémenté la méthode qu'AdiGuba a introduit dans ce thread. Dans le jar symbolisant mon plugin, j'arrive à retenir et à stocker les noms de classes contenant dans Meta-INF/services/com.truc.muche.
    Ma question est simple, comment appeler correctement la méthode décrire par Adi ?

    @++

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Cela dépend de la manière dont sont chargé tes fichiers jar.

    S'il sont présent dans le classpath de ton application au démarrage, tu peux directement utilisé le ClassLoader de ton application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Iterable<Class<? extends MonInterface>> plugins =
    		searchServices(MonInterface.class, getClass().getClassLoader());
    Sinon, si tu veux charger dynamiquement les jar, il te faut utiliser un URLClassLoader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	URL[] urls = new URL[5];
    	urls[0] = new File("file.jar").toURI().toURL();
    	// ...
     
    	ClassLoader classLoader = new URLClassLoader(urls);
     
    	Iterable<Class<? extends MonInterface>> plugins =
    		searchServices(MonInterface.class, classLoader);


    Ensuite il suffit de parcourir la liste des classes pour les instancier, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	for (Class<? extends MonInterface> type : plugins) {
     
    		// Creation d'une nouvelle instance
    		MonInterface plugin = type.newInstance();
     
    		// Utilisation de l'interface :
    		plugin.callMethod();
    	}

    Bien sûr, "com.truc.muche" doit correspondre au nom complet de "MonInterface" dans mon exemple

    a++

    PS : et il faut gérer les exception choses que je n'ai pas fait ici

Discussions similaires

  1. Charger les classes d'un Jar incluses dans un Jar
    Par daronmaster dans le forum Général Java
    Réponses: 2
    Dernier message: 08/06/2009, 22h11
  2. Exporter le .jar avec les classes .java
    Par womannosky dans le forum NetBeans
    Réponses: 2
    Dernier message: 27/01/2009, 22h27
  3. [ClassLoader]Charger les classes d'un Jar
    Par GLDavid dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2007, 17h22
  4. Lister les fichiers d'un JAR
    Par Yannick_from_31 dans le forum Langage
    Réponses: 6
    Dernier message: 02/10/2007, 11h19
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

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