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

Maven Java Discussion :

FileNotFoundException lors du chargement d'un fichier .properties


Sujet :

Maven Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut FileNotFoundException lors du chargement d'un fichier .properties
    Bonjour,

    Je cherche à charger mes infos de BDD depuis un fichier .properties présent dans les répertoires src/main/resources et src/test/ressources mais à l'exécution il me jette un FileNotFoundException !?!

    Ci-dessous mon arborescence projet :

    Projet racine
    - src
    - main
    - java
    - fr
    - projet
    - db
    MaClasse.java
    - resources
    log4j.properties
    db.properties
    - test
    - java
    - fr
    - projet
    - db
    MaClasseTest.java
    - resources
    log4j.properties
    db.properties

    Dans le code de ma classe de test je fais un simple chargement classique :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Properties prop =  new Properties();
    new FileInputStream in = new FileInputStream("db.properties");
    prop.load(in);
    in.close();

    Et à l'exécution de ma commande "mvn test" il me crache ma FileNotFoundException !
    Pourtant, il arrive bien à lire la config log4j présente dans le fichier log4j.properties qui est placée au même endroit !?!

    Pourriez-vous m'expliquer ce que je ne fais pas bien ?

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new FileInputStream("db.properties") ...
    écrit comme cela, il cherche à la racine du projet (là où le jar contenant le main est placé)
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    écrit comme cela, il cherche à la racine du projet (là où le jar contenant le main est placé)
    En effet, c'est ce que j'ai pu constater, par contre comment je fais pour qu'il cherche dans le classpath et non à la racine du projet ?
    Ou comment fait Log4j pour trouver ses petits lui ?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Tu veux placer ton db.properties à quel endroit :
    - quelque part sur le disque local ? -> il sera modifiable mais visible par l'utilisateur
    - à l'intérieur de ton jar ? -> il ne sera plus modifiable (comme si il était en dur dans l'application) mais invisible par l'utilisateur
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Bonjour et désolé pour la réponse tardive, j'étais passé sur un autre problème ...

    Donc à vrai dire les 2 choix me semblent pertinents ! D'un côté, j'apprécie la facilité de modifications du fichier en dehors du jar (et donc sans avoir besoin de le rebuilder dès qu'on veut changer une valeur) et de l'autre je trouve ça pas mal non plus de figer dans le marbre les infos qu'il porte (et qui ne devraient pas changer tous les 4 matins) ...

    Je pense que je vais pencher vers le choix n°2.

    Mais pour ma culture personnelle, je serais curieux de connaître les solutions pour chacun des choix

  6. #6
    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
    Pour charger ce qui se trouve dans ressources, donc dans le classpath, on utilise getClassLoader().getRessource[AsStream]() ou getClass().getRessource[AsStream]()

    Pour charger depuis le disque, on utilise un FileInputStream, mais cela nécessite de commencer par savoir où est le fichier. Ce peut être via un paramètre en ligne de commande de ton application, depuis le répertoire courant, depuis la home directory, ...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    En faisant
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Properties prop = new Properties();
    InputStream in = getClass().getResourceAsStream("db.properties");
    prop.load(in);
    ... j'ai un NPE !

    Visiblement, en debug, dans mon ClassLoader, le getResource(name) retourne null (d'ailleurs name est null aussi alors qu'à l'appel dans Class il est bien valorisé !?!)

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Quand j'utilise getClass().getResourceAsStream("...") en développement,
    il faut que je re-compile avant d'éxécuter.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    J'utilise Eclipse avec compilation auto et j'ai lancé un mvn clean test pour être sûr ...

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Ah et puis j'ai oublié : si tu écris InputStream in = getClass().getResourceAsStream("db.properties");
    ça veut dire qu'il va chercher le fichier db.properties dans le même package que celui de la classe
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    J'ai essayé avec "/src/test/resources/db.properties", "src/test/resources/db.properties", "/resources/db.properties", "resources/db.properties" et pas mieux ...

  12. #12
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Et avec : /test/resources/db.properties ? (qui n'est pas dans ta liste)

    Autre chose, si Eclipse se comporte comme NetBeans, alors il ne prend pas les tests dans le jar au moment du build
    donc essaye aussi avec l'emplacement définitif du db.properties
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Pareil avec "/test/resources/db.properties"

    Et Maven construit le jar après avoir passé les tests donc pour l'instant je n'ai pas de jar !

    Pour info, mes fichiers .properties sont présents dans "target\test-classes" suite à un mvn clean test

  14. #14
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Est-ce que l’arborescence est toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Projet racine
    - src
       - main
          - java
             - fr
                - projet
                   - db
                         MaClasse.java
          - resources
                log4j.properties
                db.properties
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  15. #15
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Oui c'est bien toujours ça, avec ma classe de test qui fait appel à MaClasse.java qui elle-même chercher à charger le db.properties.
    Pour rappel, ma classe de test est dans src/test/java (cf. 1er post).

  16. #16
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    si MaClasse est dans l'arborescence du main
    alors je pense qu'il faut chercher le db.properties aussi dans l'arborescence du main
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  17. #17
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    pas mieux ...

    Je vous mets mon projet en pièce jointe, que vous puissiez constater par vous-même.
    Fichiers attachés Fichiers attachés

  18. #18
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Si db.properties se trouve dans
    - main
    - ressources

    alors ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                Properties prop = new Properties();
                InputStream in = getClass().getResourceAsStream("/main/ressources/db.properties");
                prop.load(in);
                in.close();
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  19. #19
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Je viens de tester un mvn clean test avec /main/resources/db.properties et /test/resources/db.properties et j'ai le même résultat !

    Par contre je viens de tomber sur cet article http://stackoverflow.com/a/18876090 et ça marche !!!

    j'ai donc
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Properties prop = new Properties();
    InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
    prop.load(in);
    in.close();

    Aucune idée de pourquoi il fallait ce Thread.currentThread() donc si vous avez des idées, je suis preneur .
    En tout cas merci pour votre aide.


  20. #20
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut,
    as-tu essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String propFileName = "db.properties";
    InputStream inputStream = classLoader.getResourceAsStream(propFileName);
    eric

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/03/2011, 11h07
  2. Problème de chargement d'un fichier properties
    Par elitost dans le forum Langage
    Réponses: 8
    Dernier message: 18/05/2009, 00h22
  3. Réponses: 0
    Dernier message: 24/08/2008, 10h56
  4. bizarrerie de flash lors du chargement de X fichiers
    Par Lorenzo77 dans le forum Flash
    Réponses: 6
    Dernier message: 17/04/2007, 09h52
  5. erreur lors du chargement d'un fichier swf
    Par pseudobidon57 dans le forum Général VBA
    Réponses: 2
    Dernier message: 05/11/2006, 13h56

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