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 :

Java jar et problème de path


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Avril 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Avril 2019
    Messages : 26
    Points : 27
    Points
    27
    Par défaut Java jar et problème de path
    Bonjour, j'aimerais vos conseils pour faire fonctionner mon projet fait sous intellj en dehors de celui-ci.
    Dans mon programme, j'ai des ressources qui se trouvent dans des dossiers.
    J'ai besoin soi d'un fichier dans un dossier en particulier, par exemple un image qui me permet d'illustrer un simple bouton.
    Où encore, plus important, le chemin vers un dossier. Ce dossier en question se nomme "import" et me permet d'importer à l'intérieur des fichiers sur lesquels je pourrais travailler dans l'application. Normalement, il est possible d'importer uniquement des fichiers avec un format valide.
    A partir de là, je peux récupérer la liste des fichiers présent dans le dossier import pour effectuer diverses tâches.


    Un exemple de fonctionnement:

    Je veux créer un objet "DefaultListModel" afin de me permettre de remplir une JList.
    J'écris donc cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.defaultListModel = this.mainView.getModel().setModelFromFilePathFormats("import", "*.vcf", "*.txt");
    La fonction "setModelFromFilePathFormats" comprend 2 paramètres:

    -le path du dossier qui contient une éventuelle liste de fichiers
    -les formats autorisés

    La fonction ce découpe en 2 :

    -elle comprend une autre fonction "getListOfFiles" qui récupère la liste des fichiers suivant un format

    -puis elle construit elle même l'objet "DefaultListModel" avec le résultat précédent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    protected DefaultListModel setModelFromFilePathFormats(String path, String... formats) {
            File[] f = this.getListOfFiles(path, formats);
     
            DefaultListModel model = new DefaultListModel();
            model.ensureCapacity(200);
     
            for (File file : f) {
                model.addElement(file.getName());
            }
            return model;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    La fonction "getListOfFiles":
        protected File[] getListOfFiles(String path, String... formats) {
            int nbOfFormat = formats.length;
            String[] typeFile = new String[nbOfFormat];
            int incr = 0;
            for (String format : formats) {
                typeFile[incr] = format;
                incr++;
            }
            File dir = new File(path);
            return dir.listFiles((FileFilter) new WildcardFileFilter(typeFile));
        }
    Dans mon IDE, tout cela marchait bien mais maintenant, quand je veux faire fonctionner mon programme à partir d'un fichier '.jar', c'est la catastrophe et je me retrouve avec des erreurs comme celle-ci: "AWT-EventQueue-0" java.lang.NullPointerException


    Comment est ordonné mon projet sous l' ide:
    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
        monProjet
        .idea
        .lib
        ..lib1
        ..etc
        .out
        ..artifacts
        ...monProjet_jar
        ....monProjet.jar
        ..production
        .resources
        ..import
        ..image
        .src
        ..class1
        ..class2
        ..etc
    Pour récupérer mon "import", j'ai essayé diverses solutions comme ci dessous mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String path = MaClasse.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        String decodedPath = URLDecoder.decode(path, "UTF-8");
        decodedPath +="import";
        this.defaultListModel = this.mainView.getModel().setModelFromFilePathFormats(decodedPath , "*.vcf", "*.txt");
    De plus, j'ai cru comprendre que même si j'arrivais à fournir le bon path, la suite ne fonctionnerait pas car le fonctionnement dans un .jar n'est pas aussi simple.
    Quelque chose doit m'échapper la dedans car cela semble apparemment simple, on parle d'un path avec des fichiers dedans. Mais dans un jar, on semble sortir du cadre de la simplicité

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Penser a creer un exemple de test tout simple (une simple fenetre contenant une JList) démontrant ce soucis.

    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
    package test.browsefolder;
     
    import javax.swing.*;
    import java.awt.*;
    import java.io.File;
    import java.io.FileFilter;
    import java.util.Arrays;
    import java.util.Objects;
     
    public class Main {
        public static void main(final String... args) {
            SwingUtilities.invokeLater(Main::startAtEDT);
        }
     
        private static void startAtEDT() {
    //        final var path = MaClasse.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    //        final var decodedPath = URLDecoder.decode(path, "UTF-8");
    //        decodedPath +="import";
            final var main = new Main();
            final var decodedPath = "import";
            final var defaultListModel = main.setModelFromFilePathFormats(decodedPath, "*.vcf", "*.txt");
            final var list = new JList();
            final var frame = new JFrame();
            frame.setTitle("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setPreferredSize(new Dimension(300, 600));
            frame.setLayout(new BorderLayout());
            frame.add(list, BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
        }
     
        protected DefaultListModel setModelFromFilePathFormats(String path, String... formats) {
            File[] f = this.getListOfFiles(path, formats);
            DefaultListModel model = new DefaultListModel();
            model.ensureCapacity(200);
            if (Objects.nonNull(f)) {
                for (File file : f) {
                    model.addElement(file.getName());
                }
            }
            return model;
        }
     
        protected File[] getListOfFiles(String path, String... formats) {
            File dir = new File(path);
            return dir.listFiles(new WildcardFileFilter(formats));
        }
     
        private static record WildcardFileFilter(String... types) implements FileFilter {
            @Override
            public boolean accept(File pathname) {
                return true;
            }
        }
    }
    Probablement qu'il n'arrive pas a trouver ton répertoire import et donc que le tableau de fichiers retourné est null (avoir la trace de l'exception permet de voir quel ligne genere ca, et tu peux lancer ton JAR en ligne de commande pour avoir la trace ou alors la catcher et la sauvegarder dans des logs).
    Essaie de comparer les chemins retournes par tes methodes en mode execution IDE et en mode standalone et pense a mettre un garde fou autour de la methode qui liste les fichiers.

    Citation Envoyé par javadoc
    Returns:
    An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.
    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

  3. #3
    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
    C'est surtout que le répertoire import n'existe pas, puisqu'il est dans un jar.

    Un jar est un fichier. Ce qu'il contient n'est ni fichier ni répertoire. Ce sont des entrées zip.

    En soi, il n'y a pas de raison que ce soit compliqué. Pour accéder aux ressources du programme, on utilise getResource() pour une URL ou getResourceAsStream() pour un InputStream directement. C'est pas compliqué.

    Ce qui est compliqué, c'est que Java ne fournit aucun moyen de lister les ressources. Seulement d'accéder à une ressource dont on connaît déjà le chemin et le nom.

    Le plus simple, ce serait que tu fasses un fichier qui contient la liste des trucs que tu gères, au lieu d'essayer de lister des ressources. De toute façon tu ne gardes qu'une liste de nom. Pas besoin que ce soient de vrais fichiers, un nom c'est un nom.

    Il est vrai que le bricolage à base de getProtectionDomain() fait que, dans les cas simples, on peut en déduire un moyen de faire la liste des ressources. Mais ce n'est pas étudié pour, et ce n'est notamment pas compatible avec Spring boot ni jpackage. Pas franchement idéal donc. Alors qu'il est toujours possible de simplement faire un fichier qui contient la liste de ce dont on veut la liste.

    (Bon, je le reconnais, moi je me suis fait un plugin maven qui génère un fichier texte qui contient la liste des ressources. Ça évite les erreurs.)

    (Autre astuce : faire un zip des ressources qu'on veut pouvoir lister, et mettre ce zip dans les ressources au lieu d'y avoir mis les ressources telles quelles. On peut ensuite lire ce zip et tout ce qu'il contient sans problème avec getResourceAsStream())
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Perso je suis parti plus sur des fichiers qui devraient être placés hors du JAR et non pas empaquetés en son sein mais pourquoi pas. Il y avait pas assez de détails dans l'exposé du soucis.
    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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Avril 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Avril 2019
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par bouye Voir le message
    Perso je suis parti plus sur des fichiers qui devraient être placés hors du JAR et non pas empaquetés en son sein mais pourquoi pas. Il y avait pas assez de détails dans l'exposé du soucis.
    Bonsoir, j'ai choisi il y a quelques jours de faire comme cela. C'est plus simple.
    J'ai un dossier dans lequel j'ai mon ".jar" et deux autres dossier et cela marche exactement comme sous IDE car cela revient au même niveau arborescence.
    Du coup, j'ai pu terminer mon "application" https://github.com/chatPerche123/vCardManagement et j'ai même un semblant d'exécutable aussi pour le coup . Cela semble fonctionner mais c'est pas glorieux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/05/2016, 01h49
  2. Problème de Look and Feel non appliqué lors de "java -jar .."
    Par olivier57b dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 29/10/2011, 13h53
  3. problème d'utilisation java -jar
    Par ramaro dans le forum Langage
    Réponses: 8
    Dernier message: 02/08/2008, 09h56
  4. [FOP] Problème de path avec la génération d'un PDF
    Par MrMaze dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 14/03/2006, 16h53
  5. [Java et as400] Problème d'autocommit
    Par fraisetagada dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 01/07/2005, 15h54

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