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 :

Récupérer la liste des classes d'un package


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut Récupérer la liste des classes d'un package
    Est il possible de récupérer le liste des classes d'un package de façon dynamique ?

    Plus précisemment :

    je récupère le nom d'un package sous forme de String et j'aimerais pouvoir récupérer la liste des classes de ce package se trouvant dans le classloader.

    Si c'est possible, pouvez vous m'indiquer comment ?

    Merci par avance,

    Arnaud

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Je crois que ce n'est pas possible ; il me semble que cette question a déjà était posée sur le forum est que c'était ce qui en ressortait.
    A confirmer (fait une recherche sur le forum tu trouveras surement le poste en question ) ...
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    C'est tout à fait possible, il faut utiliser l'API reflection de Java. C'est d'ailleurs cette API qui permet a la JVM de sortir la trace lors de levée d'exception par exemple.
    Il y a un tutoriel sur le site developpez.com sur le sujet qui pourra te donner des éléments de réponse : http://ricky81.developpez.com/tutori...pi/reflection/

    Sinon il y a la javadoc sur cette API. Mais bon un tuto c'est toujours un peu plus simple. Il doit toujours avoir des tuto directement chez sun.

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par JFortranDoc
    C'est tout à fait possible, il faut utiliser l'API reflection de Java. C'est d'ailleurs cette API qui permet a la JVM de sortir la trace lors de levée d'exception par exemple.
    Il y a un tutoriel sur le site developpez.com sur le sujet qui pourra te donner des éléments de réponse : http://ricky81.developpez.com/tutori...pi/reflection/

    Sinon il y a la javadoc sur cette API. Mais bon un tuto c'est toujours un peu plus simple. Il doit toujours avoir des tuto directement chez sun.
    L'API de reflection est un outil très puissant mais il me semble que tu auras du mal à lister les classes d'un package avec, par exemple la classe Package, de l'API de reflection, ne propose aucune méthode te permettant de lister les classes du dit package.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    A la limite,
    • Si tu as les sources tu peus lister les .java présent dans le package qui t'intéresse.
    • Si tu sais dans quel jar ton package se trouve tu peus le lire via les classes JarFile et JarEntry, et lister les .class (du package voulu) contenues dedans.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Je sais quel est mon Jar mais je ne sais pas comment aller le lire via JarFile.

    Mon Jar se trouve dans mon war (sous Jonas). Quel chemin dois je utiliser pour lire ce jar ?

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il me semble qu'un war est en fait un jar avec juste l'extension qui change (à confirmer) ; dans ce cas tu lit dans ton war le JarEntry correspondant à ton jar, puis tu lit ce que tu cherche dans ce jar. Je suis pas sur d'être clair .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Pour information,

    je suis en exécution dans l'application web et je voudrais éviter d'avoir à mettre des chemins en dur (que ce soit pour le war ou pour le jar) pour parcourir ce jar.

    N'y a t'il pas un chemin relatif pour accéder aux jars quand on est en cours d'éxecution de l'application web ?

  9. #9
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Dans les solutions indiquées, on me dit de récupérer le classpath.

    Or la variable environnement java.class.path ne récupère pas les jars de la webapp. Seulement les Jars nécessaires au lancement de Jonas.

    Une des autres solutions est de consulter le Jar (JarFile) si l'on connait son nom. Je connais le nom du Jar mais je ne connais pas le chemin car il se trouve dans mon War (sous WEB-INF\lib). De plus l'emplacement de mon War peut varier suivant les installations des serveurs J2EE (Jonas actuellement).

    J'ai vraiment l'impression qu'il n'y a pas de solution !

  11. #11
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Heu... Je ne vois pas en quoi c'est impossible.

    Un outil comme Eclipse le fait très bien (Sinon comment il afficherait l'arborescence des packages avec leurs classes ?)

    A ta place, si j'étais toujours bloqué, j'irai voir dans les sources d'Eclipse.

  12. #12
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    Avec Google tu peux trouver du code qui fait cela...

    Le principe est de demander au class loader s'il y a un répertoire associé au package, et si c'est le cas lire les fichiers ayant l'extension ".class".

    Par exemple :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    	public static Class[] getClasses(String pckgname) throws ClassNotFoundException {
    		ArrayList<Class> classes = new ArrayList<Class>();
    		// Get a File object for the package
    		File directory = null;
    		try {
    			ClassLoader cld = Thread.currentThread().getContextClassLoader();
    			if (cld == null) {
    				throw new ClassNotFoundException("Can't get class loader.");
    			}
    			String path = pckgname.replace('.', '/');
    			URL resource = cld.getResource(path);
    			if (resource == null) {
    				throw new ClassNotFoundException("No resource for " + path);
    			}
    			directory = new File(resource.getFile());
    		}
    		catch (NullPointerException x) {
    			throw new ClassNotFoundException(pckgname + " (" + directory + ") does not appear to be a valid package");
    		}
    		if (directory.exists()) {
    			// Get the list of the files contained in the package
    			String[] files = directory.list();
    			for (int i = 0; i < files.length; i++) {
    				// we are only interested in .class files
    				if (files[i].endsWith(".class")) {
    					// removes the .class extension
    					classes.add(Class.forName(pckgname + '.' + files[i].substring(0, files[i].length() - 6)));
    				}
    			}
    		}
    		else {
    			throw new ClassNotFoundException(pckgname + " does not appear to be a valid package");
    		}
    		Class[] classesA = new Class[classes.size()];
    		classes.toArray(classesA);
    		return classesA;
    	}
    J'ai aussi trouvé une remarque intéressante qui répond à la question "pourquoi il n'y a pas de méthode getClasses() dans Package" :
    It's not possible to write a getClasses method on Package because this information simply isn't available. If I load my classes over a socket, how is the client supposed to divine all of the class names on the (not necessarily Java based) server ?
    J'ai lu tout ça sur http://forum.java.sun.com/thread.jsp...41935&tstart=0

  13. #13
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2
    Par défaut Une solution... plus complète
    Bon à force de chercher, j'ai finis par bidouiller un bout de code qui fonctionne. Il pallie les manques du code fournis plus haut en recherchant aussi les classes d'un package à l'intérieur d'un jar. Bon je met le code, je pense avoir assez bien commenté.

    J'espère avoir été utile pour mon premier post sur ce forum...

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    /**
     * Cette méthode permet de lister toutes les classes d'un package donné
     * 
     * @param pckgname Le nom du package à lister
     * @return La liste des classes
     */
    public List<Class> getClasses(String pckgname)	throws ClassNotFoundException, IOException {
    	// Création de la liste qui sera retournée
    	ArrayList<Class> classes = new ArrayList<Class>();
     
    	// On récupère toutes les entrées du CLASSPATH
    	String [] entries = System.getProperty("java.class.path")
    					.split(System.getProperty("path.separator"));
     
    	// Pour toutes ces entrées, on verifie si elles contiennent
    	// un répertoire ou un jar
    	for (int i = 0; i < entries.length; i++) {
     
    		if(entries[i].endsWith(".jar")){
    			classes.addAll(traitementJar(entries[i], pckgname));
    		}else{
    			classes.addAll(traitementRepertoire(entries[i], pckgname));
    		}
     
    	}
     
    	return classes;
    }
     
    /**
     * Cette méthode retourne la liste des classes présentes
     * dans un répertoire du classpath et dans un package donné
     * 
     * @param repertoire Le répertoire où chercher les classes
     * @param pckgname Le nom du package
     * @return La liste des classes
     */
    private Collection<Class> traitementRepertoire(String repertoire, String pckgname) throws ClassNotFoundException {
    	ArrayList<Class> classes = new ArrayList<Class>();
     
    	// On génère le chemin absolu du package
    	StringBuffer sb = new StringBuffer(repertoire);
    	String[] repsPkg = pckgname.split("\\.");
    	for (int i = 0; i < repsPkg.length; i++) {
    		sb.append(System.getProperty("file.separator") + repsPkg[i]);
    	}
    	File rep = new File(sb.toString());
     
    	// Si le chemin existe, et que c'est un dossier, alors, on le liste
    	if(rep.exists() && rep.isDirectory()){
    		// On filtre les entrées du répertoire
    		FilenameFilter filter = new DotClassFilter();
    		File[] liste = rep.listFiles(filter );
     
    		// Pour chaque classe présente dans le package, on l'ajoute à la liste
    		for (int i = 0; i < liste.length; i++) {
    			classes.add(Class.forName(pckgname + "." + liste[i].getName().split("\\.")[0]));
    		}
    	}
     
    	return classes;
    }
     
    /**
     * Cette méthode retourne la liste des classes présentes dans un jar du classpath et dans un package donné
     *
     * @param repertoire Le jar où chercher les classes
     * @param pckgname Le nom du package
     * @return La liste des classes
     * @throws IOException 
     * @throws ClassNotFoundException 
     */
    private Collection<Class> traitementJar(String jar, String pckgname) throws IOException, ClassNotFoundException {
    	ArrayList<Class> classes = new ArrayList<Class>();
     
    	JarFile jfile = new JarFile(jar);
    	String pkgpath = pckgname.replace(".", "/");
     
     
    	// Pour chaque entrée du Jar
    	for (Enumeration<JarEntry> entries = jfile.entries(); entries.hasMoreElements();) {
    		JarEntry element = entries.nextElement();
     
    		// Si le nom de l'entrée commence par le chemin du package et finit par .class
    		if(element.getName().startsWith(pkgpath)
    			&& element.getName().endsWith(".class")){
     
    			String nomFichier = element.getName().substring(pckgname.length() + 1);
     
    			classes.add(Class.forName(pckgname + "." + nomFichier.split("\\.")[0]));
     
    		}
     
    	}
     
    	return classes;
    }
     
    /**
     * Cette classe permet de filtrer les fichiers d'un répertoire. Il n'accepte que les fichiers .class.
     */
    private class DotClassFilter implements FilenameFilter{
     
    	public boolean accept(File arg0, String arg1) {
    		return arg1.endsWith(".class");
    	}
     
     
    }

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 896
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par Xavinou
    Avec Google tu peux trouver du code qui fait cela...
    J'ai aussi trouvé une remarque intéressante qui répond à la question "pourquoi il n'y a pas de méthode getClasses() dans Package" :
    Meme sans aller jusque la, rien n'empeche les classes d'un meme packages d'etre preparties dans plusieurs fichiers JAR ou repertoires de stockage du CLASSPATH... Ca devient donc d'un coup plus complexe (et gourmand en temps et en ressources) de toutes les trouver.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2
    Par défaut
    Le source que j'ai mis permet de rechercher toutes les classes d'un meme package. Quelles soient dans un jar ou dans des répertoires différents du CLASSPATH n'a aucune importance.

    Et il n'est pas aussi gourmand que ça, malgré le fait que je n'ai pas particulièrement optimisé mon code

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Dans une des solutions données, on m'indique de passer par le classpath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String [] entries = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
    Le pb est que le classpath récupérer ne correspond pas au classpath de le webapp (les jar dans lib et les classes dans le répertoire classes). Je travaille actuellement avec un war et prochainement avec un ear.

    Voici ce que je récupère dans Entries :

    [C:\JOnAS-4.1.4\lib\common\ow_jonas_bootstrap.jar, C:\j2sdk1.4.2_06\lib\tools.jar, /c:/Program Files/eclipse/plugins/com.bull.eclipse.jonas_1.1.7//template, C:\JOnAS-4.1.4\conf]
    Y a t'il un moyen de récupérer le classpath de la webapp ?

    Arnaud

  17. #17
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Par défaut
    Bonjour,
    je ne sais pas si ça interesse encore quelqu'un, mais pour récupérer le classpath de la webapp, tu peux ajouter ce bout de code si la classe que tu executes est dans la webapp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Enumeration<URL> e=getClass().getClassLoader().getResources(pckgname);
     
    //ou si la methode est statique
    //MaClasse.class.getClassLoader().getResources(pckgname); 
     
            for(;e.hasMoreElements() ; ) {
                URL u=e.nextElement();
                System.out.println("url2=="+u);
            }
    Attention: si le package fait partie d'un jar, le retour est de la forme:
    url2==jar:file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%205.0/webapps/EIMAAUTO/WEB-INF/lib/junit-3.8.1.jar!/junit
    url2==jar:file:/C:/down/Eclipse/JBossIDE-2.0.0.Beta2-Bundle-win32/eclipse/plugins/org.junit4_4.1.0.1/junit-4.1.jar!/junit

    sinon, tu obtiens:
    url2==file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%205.0/webapps/EIMAAUTO/WEB-INF/classes/junit

    le code de la classe proposé doit devenir (a tester)
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        public List<Class> getClasses(String pckgname) throws ClassNotFoundException, IOException {
    //      Création de la liste qui sera retournée
            ArrayList<Class> classes = new ArrayList<Class>();
     
    //      On récupère toutes les entrées du CLASSPATH
            String [] entries = System.getProperty("java.class.path")
            .split(System.getProperty("path.separator"));
     
    //      Pour toutes ces entrées, on verifie si elles contiennent
    //      un répertoire ou un jar
            for (int i = 0; i < entries.length; i++) {
     
                if(entries[i].endsWith(".jar")){
                    classes.addAll(traitementJar(entries[i], pckgname));
                }else{
                    classes.addAll(traitementRepertoire(entries[i], pckgname));
                }
     
            }
     
            //ajout => analyse classpath de la webapp
            Enumeration<URL> eUrl=getClass().getClassLoader().getResources(pckgname);
            for(;eUrl.hasMoreElements() ; ) {
                URL url = eUrl.nextElement();
                String sUrl=url.toString();
     
     
                if(sUrl.contains(".jar!")){
                    sUrl=sUrl.substring(0, sUrl.indexOf("!"));
                    classes.addAll(traitementJar(sUrl, pckgname));
                }else{
                    classes.addAll(traitementRepertoire(sUrl, pckgname));
                }
     
            }
     
            return classes;
        }

  18. #18
    Membre éclairé Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Par défaut
    Merci bien pour ton code nevrozed : ça m'a été d'une grande utilité

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Voici le code que j'avais mis finalement à l'époque.

    Ca fonctionne différement suivant que j'étais sur Jonas ou sur Websphere.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    public class Utilitaire
    {
    	private static final String JAR_URL_SEPARATOR = "!/";
    	private static final String FILE_URL_PREFIX = "file:";
     
    	public static ArrayList lireListService(String nom_package) {
     
    		// Instanciation de la liste de service
    		ArrayList listService = new ArrayList();
     
    		// Mis en forme du nom du package pour la methode getresources (pour la methode getresource, il faut rajouter / au début de la chaîne 
    		String name = new String(nom_package);
    		name = name.replace('.','/');
     
    		// TODO : Necessaire sous Websphere - A ne pas mettre sous Jonas
    		name = name  + "/";
     
     
    		URL url = null; 
    		Enumeration enum = null;
    	  	try
    		{
    	  		// Recuperation sous forme d'enumeration de la liste des URL contenant ce package
    			enum = Utilitaire.class.getClassLoader().getResources(name);
    		}
    		catch (IOException e1)
    		{
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    		if (enum!=null) {
    			// Parcourt la liste des URL
    			while (enum.hasMoreElements()) {
     
     
    				// Récupération d'une URL
    				url = (URL) enum.nextElement();
     
     
     
    				File directory = new File(url.getFile());
     
     
    				// New code
    				// ======
    				if (directory.exists()) {
    				    // Recupere la liste des fichiers dans le package (si les classes sont directement dans un repertoire)
    				    String [] files = directory.list();
    				    for (int i=0;i<files.length;i++) {
     
    					// Ne prends que le fichier finissant par .class. Ne pas tenir compte des sources si present.
    					if (files[i].endsWith(".class")) {
    				        // removes the .class extension
    					   String classname = files[i].substring(0,files[i].length()-6);
     
     
    					    listService.add(classname);
    					}
    				    }
    				} else {
    				    try {
    					// Si on est pas dans un repertoire
    					// le package doit être contenu dans un jar
    				    URLConnection con = url.openConnection();
    				    JarFile jfile = null;
    				    String starts = null;
     
    				    if (con instanceof JarURLConnection) { 
    				    	// Should usually be the case for traditional JAR files. 
    				    	JarURLConnection jarCon = (JarURLConnection) con; 
    				    	jfile = jarCon.getJarFile();
    				    	starts = jarCon.getEntryName();
    				    					    	}
    				    else {
    					    String urlFile = url.getFile();
    					    int separatorIndex = urlFile.indexOf(JAR_URL_SEPARATOR); 
    					    String jarFileUrl = urlFile.substring(0, separatorIndex);
    					    if (jarFileUrl.startsWith(FILE_URL_PREFIX)) { 
    					    	jarFileUrl = jarFileUrl.substring(FILE_URL_PREFIX.length()); 
    					    } 
    					    jfile = new JarFile(jarFileUrl); 
    					   					    starts = urlFile.substring(separatorIndex + JAR_URL_SEPARATOR.length()); 
    				    }
     
     
     
    					Enumeration e = jfile.entries();
    					while (e.hasMoreElements()) {
    						// Parcourt les differents elements du jar
    					    ZipEntry entry = (ZipEntry)e.nextElement();
    					    String entryname = entry.getName();
    					    if (entryname.startsWith(starts)
    						&&(entryname.lastIndexOf('/')<=starts.length())
    						&&entryname.endsWith(".class")) {
    					    	// Ne prends que les fichiers class appartenant au package dans le JAR
     
    					    	// Ne recupere que le nom de la classe sans le package
    					    	String classname = entryname.substring(0,entryname.length()-6);
    					    	if (classname.startsWith("/"))
    								{
    					    		classname = classname.substring(1);
    								}
    					    						    	classname = classname.substring(starts.length());
    					    	listService.add(classname);
    					    }
    					}
    				    } catch (IOException ioex) {
    					System.err.println(ioex);
    				    }	
    				}
    			}
    		}
     
     
     
     
    		return listService;
     
     
     
     
    	}
     
    }

  20. #20
    Membre confirmé Avatar de balmeyer
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 84
    Par défaut
    Petite correction : les codes indiqués ne fonctionnent pas totalement chez moi lorsque le chemin contient un espace.

    Il faut convertir le symbole "%20" dans l'URL par l'espace, comme indiqué ici :

    http://snippets.dzone.com/posts/show/4831

    En ajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resource.getFile().replace("%20", " "))
    C'est utile si les projets se trouvent dans "Mes Documents' !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/11/2008, 11h11
  2. Liste des classes d'un package d'un PlugIn
    Par SpIrIt505050 dans le forum Langage
    Réponses: 2
    Dernier message: 25/07/2007, 15h45
  3. lire la liste des classes d'un package sous Websphere
    Par Coulon Arnaud dans le forum Websphere
    Réponses: 4
    Dernier message: 21/05/2007, 09h22
  4. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41
  5. Récupèrer la liste des disques durs
    Par Tililian dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/06/2003, 12h42

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