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 :

accéder à une donnée qui se trouve dans le classpath. Pb avec un jar


Sujet :

Langage Java

  1. #1
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut accéder à une donnée qui se trouve dans le classpath. Pb avec un jar
    Bonjour,

    Dans un programme, je souhaite accéder à une ressource qui se trouve dans le classpath. Dans le cas normal, j'utilise le code suivant qui fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    URL objUrl = getClass().getResource("/fr/.../report/toto.jrxml");
    JasperDesign objJasperDesign = JRXmlLoader.load(objUrl.getFile());
    Mais pour déployer sur le serveur de test je dois fais un jar. Le fichier jrxml se trouve dans le jar mais je n'arrive pas à y accéder.

    Est ce que vous savez comment je pourrais faire ?

    Merci.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Ben, si c'est dans ton jar, tu connais le chemin depuis ton répertoire d'exécution, non...?

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    La classe sur laquelle tu fais le getClass() fait-elle partie du même jar que ton fichier jrxml ???

    a++

  4. #4
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Je ne suis pas sur de bien comprendre ce que tu veux dire par "chemin depuis ton répertoire d'exécution".

    Mais en tout cas, je ne veux pas mettre en dur mon chemin pour accéder à mon fichier.

    adiGuba -> oui les deux fichiers sont dans le même jar.

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nighthammer Voir le message
    adiGuba -> oui les deux fichiers sont dans le même jar.
    Et quel est le chemin complet que tu passes et l'arborescence exacte du jar ?
    Vérifies aussi les éventuelles différentes de minuscules/majuscules...

    a++

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par nighthammer Voir le message
    Mais en tout cas, je ne veux pas mettre en dur mon chemin pour accéder à mon fichier.
    Ben, un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String chemin = @"./mondossier/monfichier.xml"
    ne peut pas convenir?

  7. #7
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    la fonction "getClass().getResource" renvoi une valeur comme celle-ci :
    D:/bea/.../toto.jar!/fr/.../report/toto.jrxml

    J'ai vérifié, je n'ai pas de problème de minuscule/majuscule car tout est en minuscule.

  8. #8
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.
    Ton problème vient du fait que tu passes par un File, ce qui ne marche pas dans un fichier jar.
    Donc, il faut remplace ton code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    URL objUrl = getClass().getResource("/fr/.../report/toto.jrxml");
    JasperDesign objJasperDesign = JRXmlLoader.load(objUrl.getFile());
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream s = getClass().getResourceAsStream("/fr/.../report/toto.jrxml");
    JasperDesign objJasperDesign = JRXmlLoader.load(??s??);
    Tu récupères un InputStream du jar (ça, c'est faisable), mais ensuite, il faut s'assurer que JRXmlLoader acceptes un InputStream comme paramètre.

  9. #9
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Merci à tous pour vos réponses.

    En effet djo.mos, en utilisant un InputStream plutôt qu'un File ça a fonctionné.

    Encore merci.

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nighthammer Voir le message
    la fonction "getClass().getResource" renvoi une valeur comme celle-ci :
    D:/bea/.../toto.jar!/fr/.../report/toto.jrxml
    Oups autant pour moi j'ai lu ton message un peu trop vite je pensais que getResource() te retournais null !


    En fait le problème c'est que tu l'utilises mal car tu considère qu'une ressource correspond forcément à un fichier or ce n'est pas toujours le cas !

    Ici la ressource correspond à une entrée d'un fichier Jar, et bien qu'on considère qu'il s'agit d'un fichier ce n'est pas le cas au niveau du système (j'entends par là que ce n'est pas un fichier directement accessible par le système de fichier de l'OS).

    D'ailleurs l'URL qui t'es retourné le montre bien car elle est de la forme jar:file:D:/bea/.../toto.jar!/fr/.../report/toto.jrxml

    Or le getFile() de la classe URL ne te renvoi pas forcément un lien vers un fichier existant, mais une partie ainsi nommé de l'URL...

    Bref cela ne peut fonctionner que lorsque la ressource correspond à un vrai fichier (en dehors d'un jar donc) car à ce moment l'URL renvoyé (file correspond bien à un vrai fichier...



    Pour éviter ce type d'erreur il faut toujours raisonné avec des URL ou des flux, c'est à dire :
    • Si la méthode accepte une URL, lui passer directement l'URL et elle se débrouillera toute seule pour trouver les données).
    • Si la méthode accepte un InputStream on peut utiliser la méthode openStream() de la classe URL pour lui ouvrir directement un flux vers les données (c'est la classe URL qui s'occupera dans ce cas précis d'ouvrir le jar et de décompresser l'entrée en question).


    En général les classes qui attentent des données depuis un fichier propose aussi au moins une de ces deux possibilités...


    Dans ton cas d'après la doc il faut utiliser un InputStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    JasperDesign objJasperDesign = null;
    URL objUrl = getClass().getResource("/fr/.../report/toto.jrxml");
    InputStream in = objUrl.openStream();
    try {
         objJasperDesign = JRXmlLoader.load(objUrl.getFile());
    } finally {
         in.close();
    }

    Note que tu peux également utiliser directement getResourceAsStream() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    JasperDesign objJasperDesign = null;
    InputStream in = getClass().getResourceAsStream("/fr/.../report/toto.jrxml");
    try {
         objJasperDesign = JRXmlLoader.load(objUrl.getFile());
    } finally {
         in.close();
    }

    Et là cela devrait marcher quel que soit l'emplacement de ta ressource (fichier simple, dans un jar/zip, sur une machine distante, etc...)

    a++

    PS : bon en prévisualisant je vois que je me suis attardé mais comme j'ai donné plein de détail je poste quand même...

  11. #11
    Membre régulier Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Merci adiGuba pour toutes ces infos

    Ca devrait m'être util par la suite.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/09/2008, 10h09
  2. [HTML] Shape area sur une image qui se trouve dans un div
    Par Ryan Sheckler dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 19/06/2007, 17h48
  3. Réponses: 7
    Dernier message: 23/08/2006, 18h40
  4. Recuperer une image qui se trouve dans le presse papier
    Par kaderscream dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/08/2006, 10h39
  5. Réponses: 7
    Dernier message: 16/06/2006, 16h31

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