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

avec Java Discussion :

Problème d'accès à du contenu dans un package


Sujet :

avec Java

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 175
    Points : 193
    Points
    193
    Par défaut Problème d'accès à du contenu dans un package
    Bonsoir,
    Je suis actuellement face à un problème que je n'arrive pas à résoudre. J'ai un projet développé sous Netbeans dans lequel j'accède à du contenu (images mais également des classes) des différents packages de ce projet. Lorsque j'exécute le projet sous Netbeans tout fonctionne parfaitement, par contre lorsque je lance mon soft (le .jar) en ligne de commande ou en double cliquant sur l'exécutable, ce contenu n'est pas trouvé...

    Est ce quelqu'un a déjà été face à ce problème?

    Le code qui pose problème sert à récupérer le nom des Classes que j'ai dans un package
    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
        /**
         * Scans all classes accessible from the context class loader which belong to the given package and subpackages.
         *
         * @param packageName The base package
         * @return The classes
         * @throws ClassNotFoundException
         * @throws IOException
         */
        public static List<String> getClasses(String packageName)
                throws ClassNotFoundException, IOException 
        {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            assert classLoader != null;
            String path = packageName.replace('.', '/');
            List<File> dirs = new ArrayList<File>();
            Enumeration<URL> resources = classLoader.getResources(path);
            while (resources.hasMoreElements()) {
                URL resource = resources.nextElement();
                String fileName = resource.getFile();
                String fileNameDecoded = URLDecoder.decode(fileName, "UTF-8");
                dirs.add(new File(fileNameDecoded));
            }
            ArrayList<String> classes = new ArrayList<String>();
            for (File directory : dirs) {
                classes.addAll(findClasses(directory, packageName));
            }
            return classes;
        }
     
        /**
         * Recursive method used to find all classes in a given directory and subdirs.
         *
         * @param directory   The base directory
         * @param packageName The package name for classes found inside the base directory
         * @return The classes
         * @throws ClassNotFoundException
         */
        private static List<String> findClasses(File directory, String packageName) throws ClassNotFoundException 
        {
            List<String> classes = new ArrayList<String>();
            if (!directory.exists()) {
                return classes;
            }
            File[] files = directory.listFiles();
            for (File file : files) {
                String fileName = file.getName();
                if (file.isDirectory()) {
                    assert !fileName.contains(".");
                    classes.addAll(findClasses(file, packageName + "." + fileName));
                } else if (fileName.endsWith(".class") && !fileName.contains("$")) {
                    classes.add(fileName.substring(0, fileName.length() - 6));
                }
            }
            return classes;
        }

    Cordialement,
    Julien

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonsoir,

    je développe avec Eclipse, mais j'ai eu un problème similaire.
    Pour le résoudre, il a fallut que je précise dans les propriétés du projet, d'inclure les dossiers contenant mes ressources et autres fichiers.
    Bien que ceux-ci était intégrés dans le projet lorsqu'il tournait sous Eclipse.

    Vous avez peut être des options de projet à configurer lorque vous créez le JAR final...
    @ bientôt...

    Salut & @+ sur 3W!

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    votre code n'a aucune chance de fonctionner dans une jar, il n'y a pas de méthode "simple" pour explorer un package java, puisque celui-ci peux prendre une multitude de formes (fichiers éclatés sur le disque dur, ressources dans une jar, fichiers accessibles à la demande sur une serveur distant pour les applets, etc).

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 175
    Points : 193
    Points
    193
    Par défaut
    Le code fonctionne parfaitement bien sur Netbeans et mon but est d'inclure les fichiers dans le JAR afin d'avoir le même résultat.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui, et c'est impossible.

    Fais simplement une liste de tes classes, quelque part, et sers-toi de ça. Au besoin fais autogénérer cette liste par ton système de build.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 175
    Points : 193
    Points
    193
    Par défaut
    Merci pour ces informations.
    Cependant, serait-il possible que tu m'expliques pourquoi ceci est impossible s'il te plait? J'ai du mal à comprendre pourquoi ceci fonctionne lorsque le code est exécuté sous Netbeans et en dehors non :s

    Merci d'avance

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    parce que la classe File correspond à des Fichiers présent sur le disque et traité par le système d'exploitaiton. Quand tu met tout ça dans une jar, les fichiers n'existent plus, tu n'a plus que des entrées dans le JAR. C'est pour ça que toutes les méthodes liées à classloader retournent des URL et pas des File.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/07/2008, 14h07
  2. Récupérer les classes contenu dans un package
    Par guizzmo dans le forum Eclipse Platform
    Réponses: 6
    Dernier message: 10/07/2007, 12h08
  3. Réponses: 3
    Dernier message: 18/05/2007, 16h03
  4. Problème d'accès à un vector dans un vector
    Par Petzouille57 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 18/05/2007, 10h28
  5. Probleme d'acces à une vue dans un package
    Par cli16 dans le forum SQL
    Réponses: 12
    Dernier message: 12/02/2007, 16h41

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