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 :

Resource fichier non trouvée


Sujet :

Langage Java

  1. #1
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut Resource fichier non trouvée
    Bonjour,
    Je m'arrache les cheveux avec ça depuis des heures.
    Mon programme n'arrive pas à trouver une ressource fichier, quand je le lance à partir de sa version jar. Quand je lance à partir de mon IDE il le trouve.
    Le fichier est là, j'ai vérifié, je le copie au build dans le même répertoire que mes jar, dont je teste le déploiement:
    zweegercore.jar
    zweeger.jar
    zweegerexe.jar
    preferences.properties

    je démarre zweegerexe.jar et je cherche "/preferences.properties" en faisant
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    URL url=this.getClass().getResource(pathToFile);
    return new File(url.toURI());
    où le getResource me retourne null quand je lance l'application dans le contexte jar

    A savoir (si ça a un intérêt): la classe "this" avec laquelle je fais le getResource, se trouve dans zweegercore.jar....

    Merci pour votre aide

  2. #2
    Membre Expert
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Par défaut
    Bonjour,

    Tu lances ta commandes à partir d'où ?

  3. #3
    Membre éprouvé
    Avatar de flo.87
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Par défaut
    Le fait de faire getResource sur une classe récupère un fichier dans le contexte de la classe.

    Dans ton cas, il cherche le fichier "preferences.properties" dans le jar. Comme tu as précisé "/preferences.properties", il doit chercher le fichier à la racine de ton Jar.

  4. #4
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par flo.87
    Le fait de faire getResource sur une classe récupère un fichier dans le contexte de la classe.
    C'est vrai que ça marche bien avec un autre fichier .properties qui est dans le jar. Ca expliquerait bien des choses, mais alors cette FAQ serait-elle incorrecte ? Sauf si le getResource et le getResourceAsStream se comportent différemment.

    Citation Envoyé par Anthony.Desvernois
    Tu lances ta commandes à partir d'où ?
    Via un command-prompt avec le prompt dans le répertoire de mes jar.

  5. #5
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Bon j'ai procédé autrement. Plutôt que passer via des getResource je passe directement via un getFile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new File(System.getProperty("user.dir")+File.separator+pathToFile);
    En conclusion:
    - ça me coupe toute possibilité d'inclure ces fichiers dans le jar,
    - ça ne me dit pas pourquoi ça ne marchait pas avec get getResource,
    - mais ça fonctionne, c'est ce qui m'importe aujourd'hui.

    Merci pour vos remarques.

  6. #6
    Membre éprouvé
    Avatar de flo.87
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Par défaut
    Si le fichier que tu ouvres est destiné à être modifié, tu n'aurais pas pu (sauf erreur de ma part), le placer dans un Jar.
    En effet, il n'est pas possible d'ajouter, de modifier ou de supprimer un fichier présent dans un Jar (sauf reconstruire tout le Jar).

  7. #7
    Membre éprouvé
    Avatar de flo.87
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Par défaut
    Pour en revenir à ton problème initial,

    Si tu veux ajouter un dossier au classpath de ton Jar, tu édites le MANIFEST.MF (sorte de fichier de configuration de Jar) pour ajouter la ligne :

    Et dans ce cas-là, tu peux accéder aux fichiers présents dans le dossier par la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.getClass().getResource("/fichier");

  8. #8
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Merci. Je vais essayer ça. J'avais pas du tout pensé à cette option.

  9. #9
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Ma solution du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new File(System.getProperty("user.dir")+File.separator+pathToFile);
    ne marche pas dans tous les cas
    Je développe un plugin audio, à intégrer dans un hôte audio, l'hôte étant un choix de l'utilisateur.

    Dans 80% de mes tests, le System.getProperty("user.dir") retourne le répertoire où se trouve le jar de mon plugin. Mais dans 20% des cas, il retourne un autre emplacement. En fait il retourne le chemin de démarrage d'un Command Prompt sous windows (Menu Démarrer--> Run-->"cmd").

    D'où la question: par quel moyen atteindre à 100% ces ressources fichiers qui sont dans l'arborescence de mon jar de démarrage ?

  10. #10
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par lvr Voir le message
    C'est vrai que ça marche bien avec un autre fichier .properties qui est dans le jar. Ca expliquerait bien des choses, mais alors cette FAQ serait-elle incorrecte ? Sauf si le getResource et le getResourceAsStream se comportent différemment.
    Pourquoi serait-elle incorrect ?

    getResource() permet d'accéder à une ressource du classpath, mais il faut bien prendre en compte que ce n'est pas forcément un fichier au sens du système d'exploitation !

    Citation Envoyé par lvr Voir le message
    Dans 80% de mes tests, le System.getProperty("user.dir") retourne le répertoire où se trouve le jar de mon plugin. Mais dans 20% des cas, il retourne un autre emplacement. En fait il retourne le chemin de démarrage d'un Command Prompt sous windows (Menu Démarrer--> Run-->"cmd").
    Ce qui est tout à fait normal : "user.dir" représente le répertoire de travail, qui dépend fortement de la manière dont on lance l'application...

    Citation Envoyé par lvr Voir le message
    D'où la question: par quel moyen atteindre à 100% ces ressources fichiers qui sont dans l'arborescence de mon jar de démarrage ?
    Dans l'exemple que tu donnes, le fichier n'est pas dans ton jar mais à coté...


    Donc il faudrait savoir :
    • Où veux-tu que ton fichier soit placé ?
    • Doit-il être accéder en lecture ou en écriture ?


    a++

  11. #11
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Merci de ta réponse rapide. Mon soft malgré qu'il soit en version beta, faiblement annoncé est déjà référencé sur plusieurs sites, avec ses bugs, ça craint

    Les réponses:
    Ma structure de fichier est la suivante, dans un répertoire au choix que je connais pas, car choisi par l'utilisateur à l'unzip.

    .\zweeger.dll :
    le plug, qui est un wrapper VST(norme C de plugins audio) -> java. Ce plug crée un nouvel objet d'une classe référencée dans le fichier de config
    .\zweeger.ini:
    le fichier de config du wrapper, où je lui indique quelle est la classe à instancier et où la trouver ainsi que les jar du wrapper
    .\zweeger\zweeger.jar
    Le jar de mon application qui contient les classes et des ressources non modifiables (dtd + application.properties)
    .\zweeger\preferences.properties
    Les préférences de l'utilisateur. Le unzip en amène une version par défaut. Modifiable par l'utilisateur
    .\zweeger\default.zwg
    Un "fichier"/"objet"/"document" chargeable dans l'application: c'est comme le Normal.dot dans Word: ça sert à l'initialisation et c'est modifiable.
    .\zweeger\Icons\lfo.png
    Les icônes de l'application. Rem: Auraient pu être dans le jar, mais comme j'avais tout écrit en parcourant tout le contenu du répertoire \Icons\ et en le chargeant, et que ceci n'est pas possible dans un jar, je les ai laissées en dehors du jar.
    Rem: je n'ai aucun contrôle sur zweeger.dll (c'est le wrapper) et, je ne modifie zweeger.ini que dans le sens décrit pas son auteur (classpath, classe du plugin, options du wrapper, ...)

    Dans l'exemple que tu donnes, le fichier n'est pas dans ton jar mais à coté...
    Je me suis mal exprimé.
    En résumé, mes ressources statiques (sauf les icônes) sont dans le jar.
    Les ressources dynamiques sont à côté du jar. Ce sont celles-là que j'ai du mal à atteindre de manière systématique (ex: default.zwg)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    quand t'as absolument besoin de connaitre l'endroit où se trouve ton application, pour y lire des fichiers de configuration par exemple, le plus simple est de recourir à un installeur qui créera un fichier .bat ressemblant à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java '-DMonDossier=c:\Installation\de\machin' -jar machin.jar
    car si il n'y a pas de moyen fiable de détecter où se trouve ton application (et pour cause elle pourrait meme ne pas etre locale), un installeur, lui, connait l'endroit où on lui a demandé d'installé, et il peut préparer le .bat approprié.

    au fait, en java, ce qui n'est pas dans le classpath (comme tes fichier .ini en dehors du jar), n'est pas une "resource"

  13. #13
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    En effet la manière dont tu vas déployer l'application va avoir une incidence ! Le principal problème des fichiers à l'intérieur d'un jar, c'est qu'ils ne sont pas modifiable...

    Quelques solutions :

    • Si tu utilises Java Web Start une solution serait de passer par PersistenceService.
    • Sinon une solution serait d'avoir les fichiers en double : un dans le jar avec les valeurs par défaut, et un dans le répertoire de l'utilisateur (new File(System.getProperty("user.home"), ".monappli")) qui sera donc modifiable par l'utilisateur.
    • Enfin si ton application est en local, tu peux utiliser les ressources pour retrouver le nom du fichier jar, et donc son emplacement sur le disque (voir ce message : http://www.developpez.net/forums/d67...x/#post3949248 )



    a++

  14. #14
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Tchize, adiGuba, Merci.
    Le problème d'essayer de mémoriser une info à l'installation, c'est que si chaque utilisateur de mon plugin, travail de la même manière que je bosse avec les plugins des autres (les déplacer, les réorganiser, les supprimer, ... : j'ai plus ou moins 200 plugs installés ), aucune info figée à l'installation n'est viable.

    Donc la troisième solution d'abiGuba me semble parfaite. J'ai presque envie de brosser le boulot pour aller l'essayer chez moi Je vous tiens au courant.

  15. #15
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 920
    Par défaut
    Résolu. Merci. Cette 3ème solution a fait l'affaire.

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

Discussions similaires

  1. Fichier non trouvé, bien qu'existant
    Par ALT dans le forum Administration système
    Réponses: 18
    Dernier message: 30/03/2007, 10h21
  2. importation de données : fichier non trouvé
    Par sam01 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 18/01/2007, 14h38
  3. fichier non trouvé dans apache?
    Par darkbob dans le forum Web
    Réponses: 1
    Dernier message: 18/07/2006, 03h03
  4. Création version client - fichiers non trouvés
    Par Pascal dans le forum WinDev
    Réponses: 7
    Dernier message: 03/12/2004, 11h34
  5. [Debutant][Install][VS]erreur sur fichier non trouvé.
    Par silvermoon dans le forum DirectX
    Réponses: 4
    Dernier message: 16/07/2004, 20h59

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