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 :

[JAR] lire un fichier dans un jar OU hors d'un jar


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut [JAR] lire un fichier dans un jar OU hors d'un jar
    Bonjour,

    je fais du développement sous Eclipse et je compile mes jar en utilisant Ant. Mon problème est assez simple. Dans la racine de mon fichier JAR, j'ai un fichier (tstamp.txt) qui contient un timestamp du build. Je peux lire ce fichier assez facilement dans le JAR (merci la FAQ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package com.developpez; 
     
    public class Test 
    { 
     
      public Test() 
      { 
        InputStream is1 = getClass().getResourceAsStream("fichier.txt"); 
     
        InputStream is2 = getClass().getResourceAsStream("/fichier.txt"); 
      } 
    }
    J'aimerai pouvoir le lire aussi si il se trouve dans la racine de ma classe (pas dans un jar), sans modifier mon code.

    Est-ce possible ?

    Merci



    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Sous UNIX ou MacOS X, tu n'auras pas de problème pour le lire, qu'il se trouve à la racine ou dans le Jar car les séparateurs sont les mêmes.

    Par contre, si tu utilises Windows, tu seras obligé d'utiliser une constante pour les slashes et pour le jar, il ne faut pas utiliser cette constante, mais un slash UNIX classique.
    Хајде Јано коло да играмо

  3. #3
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut
    Je suis sous Windows.

    Ce que j'aimerai, c'est de ne pas devoir faire un coding différent quand je teste la classe sous Eclipse ou à partir de mon fichier Jar (avec une "task" Ant).

    Est-ce possible ? Je crains que non ?

    J'ai pas envie de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (dansLeJar) { 
         //je démarre depuis le jar
    } else {
         // je démarre depuis com.société.dept.class...
    }

  4. #4
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Je ne crois pas que ce soit possible.
    Хајде Јано коло да играмо

  5. #5
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut
    Grrrr, si je comprends bien je ne vais pas pouvoir éviter les if (...getClass()...) {...} else {... }

    Pas de chance pour moi

  6. #6
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    tu peux essayer de faire quelque chose comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Test
    {
     
      public Test()
      {
        String jarName = "fichier.txt";
        if (dansLeJar) {
          jarName = "/"+fichier.txt;
        }
        InputStream is1 = getClass().getResourceAsStream(jarName);
      }
    }
    ca sera mieu que de faire tout ton traitement differement si tu te trouve dasn ton jar ou pas ...
    je sais bien que c'est pas encore ce qu'il y a de mieu mais en attendant...

    EDIT: Il serait etonnant qu'il n'y ait pas d'autre solution plus élégante, il faut prendre le temps de la chercher.
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  7. #7
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut
    En fait, je faisait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MaClasse {
    	public static void main(String[] args) {
    		//...
    	}
    }
    Dans le code du main, je ne sais pas faire de "getClass()".

    Comment savoir si je suis dans un jar à ce moment là ?

  8. #8
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    une solution vraiment pas belle serait d'ouvrir le fichier "fichier.txt" et en cas d'echec tu ouvre le fichier "/fichier.txt" ...
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  9. #9
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Reponse toute simple: tu copies ton fichier dans le repertoire build ou bin qu'Eclipse te cree pour mettre les classes.

    2eme solution: tu crees ton jar une fois avec ant .. tu le rajoutes a la fin du build path d'Eclipse.. inconvenient chaque fois que ton fichier change tu dois regenerer ton jar ..

    Dans ton code tu fais getClass().getResourceAsStream("/tstamp.txt") par exemple .. tu as tout les details pour ca dans la FAQ java.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  10. #10
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut
    J'ai bein compris, mais
    - le getClass() n'est pas possible à partir de "main(String[] args)"
    Ce que je voulais, c'est une ligne de code unique pour lire le lire, que la classe soit dans un jar ou pas. (j'ai bien sur copié mon fichier à la racine de /bin).

    En fait mon soucis est de lire un fichier build-time-stamp généré par ant lors de la création du jar et d'afficher cette information dans un "about box". Je n'avais pas envie d'avoir 2 coding différents et de me rendre compte d'une erreur quand je lance mon programme depuis un jar ou l'inverse d'avoir des erreurs quand je le lance depuis Eclipse (ce que j'ai actuellement).

  11. #11
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    tu peux pas lancer ton jar avec une tache ant depuis eclipse ?
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  12. #12
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut
    Oui, bien sur, c'est ce que je fais, mais le lancement du jar depuis un tache Ant implique (depends =...) de compiler les sources et de créer le Jar. Ce que j'aimerai c'est de pouvoir lancer le programme "rapidement" depuis eclipse (qui a déjà tout compilé) en cliquant simplement sur l'icône "run", sans devoir passer par le run de build.xml et devoir choisir la bonne tâche.

    J'ai déjà beaucoup cherché, mais je ne pense pas qu'il est possible d'y arriver sans passer par l'étape "if (dansLeJar)". Ce n'est pas catastrophique, mais juste qu'à maintenant, j'avais toujours trouvé une solution propre, élégante, ... à tous les problèmes.

    C'est déjà génial de pouvoir lire des infos dans un fichier dans un jar en une ligne, peut-être suis-je trop exigeant

  13. #13
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par yveslamand
    J'ai bein compris, mais
    - le getClass() n'est pas possible à partir de "main(String[] args)"
    Ce que je voulais, c'est une ligne de code unique pour lire le lire, que la classe soit dans un jar ou pas. (j'ai bien sur copié mon fichier à la racine de /bin).

    En fait mon soucis est de lire un fichier build-time-stamp généré par ant lors de la création du jar et d'afficher cette information dans un "about box". Je n'avais pas envie d'avoir 2 coding différents et de me rendre compte d'une erreur quand je lance mon programme depuis un jar ou l'inverse d'avoir des erreurs quand je le lance depuis Eclipse (ce que j'ai actuellement).
    Depuis un code static (genre main) il faut faire : NomDeTaClasse.class.getResourceAsStream(...)

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  14. #14
    Membre régulier
    Homme Profil pro
    SAP BC Admin
    Inscrit en
    Août 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : SAP BC Admin
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 75
    Points : 119
    Points
    119
    Par défaut
    Ca fonctionne, mon problème était la lecture d'un icone.

    Le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	ImageIcon icon1 = new ImageIcon(MaClasse.class.getClass().getResource("/icon1.gif"));
    	System.out.println(icon1);
    donne ceci quand on n'est pas dans le jar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file:/C:/.../Project/build/icon1.gif
    et ceci quand on est dans le jar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jar:file:/C:/.../Project/dist/myjar.jar!/icon1.gif
    C'est vraiment bien Java !

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

Discussions similaires

  1. Lire un fichier dans un jar
    Par NainzguL dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 24/06/2008, 16h14
  2. [JAR] Lire un fichier txt dans un Jar
    Par flzox dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 28/08/2006, 01h30
  3. [JAR]Modification de fichier dans un jar
    Par vberetti dans le forum Général Java
    Réponses: 14
    Dernier message: 13/06/2005, 17h56
  4. [JAR] Lire et Ecrire dans un fichier contenu dans un jar
    Par lipao17 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/05/2005, 12h01
  5. [JAR] Accéder à un fichier dans un jar
    Par Nanoua dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 06/07/2004, 13h00

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