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 :

Lire une donnée contenue dans un fichier MANIFEST.MF


Sujet :

Langage Java

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut Lire une donnée contenue dans un fichier MANIFEST.MF
    Bonjour,

    au moment de la compilation sous Netbeans de mon projet, je demande à écrire la date de compilation dans le fichier manifest grâce au fichier build.xml :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="MonProjet" default="default" basedir=".">
        <description>Builds, tests, and runs the project MonProjet.</description>
        <import file="nbproject/build-impl.xml"/>
        <tstamp>
            <!--<format property="compilationtime" pattern="dd.MM.yyyy_HH.mm.ss" />-->
            <format property="compilationtime" pattern="dd.MM.yy" />
        </tstamp>
        <manifest file="MANIFEST.MF">
            <attribute name="Version" value="${compilationtime}" />
            <attribute name="SplashScreen-Image" value="resources/logo.png" />
        </manifest>
    </project>

    Puis je lis le contenu de ce fichier manifest contenu dans le jar généré :
    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
        private void getProjectVersion()
        {
            Manifest manifest;
            InputStream is;
            Attributes att;
            String info;
     
            try
            {
                is = this.getClass().getResourceAsStream("/META-INF/MANIFEST.MF");
                manifest = new Manifest(is);
     
                att = manifest.getMainAttributes();
                info = "Version : " + att.getValue("Version");
     
                this.jLabelVersion.setText(info);
                is.close();
            }
            catch (NullPointerException ex)
            {
                this.jLabelVersion.setText("Erreur");
            }
            catch (IOException ex)
            {
                this.jLabelVersion.setText("Erreur");
            }
        }
    Ce code fonctionne sans problème sous Windows. Mais quand je compile sous Ubuntu (toujours avec Netbeans) att.getValue("Version") me retourne null. Aucune exception est levée.

    Quel est le problème ?
    J'ai vérifié le jar généré sous Ubuntu, la casse du dossier et du fichier est bien respectée.

  2. #2
    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
    Si tu récupère le MANIFEST.MF directement dans le jar à la mano, l'entrée est bien là?

    Que donne le parcours de manifest.keySet()?

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    J'ai regardé le fichier MANIFEST.MF dans le jar et effectivement l'information n'est pas présente.

    Manifest-Version: 1.0
    Ant-Version: Apache Ant 1.9.2
    Created-By: 1.7.0_55-b14 (Oracle Corporation)
    Class-Path: lib/ExportAs.jar lib/XMLEditor.jar lib/itextpdf-5.
    1.2.jar lib/jOpenDocument-1.3.jar lib/AbsoluteLayout.jar
    Main-Class: monprojet.MonProjet
    Pourtant le fichier manifest à la racine du projet, contient bel et bien cette donnée.

    Comment corriger ce problème (sans doute une directive de compilation qui manque) ?

  4. #4
    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
    Je commencerais par vérifier si il n'a pas créé un fichier MANIFEST.MF ailleurs dans le projet.

  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
    Salut,

    Citation Envoyé par Auteur Voir le message
    Comment corriger ce problème (sans doute une directive de compilation qui manque) ?
    Comment tu génères ton jar ?


    a++

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    J'ai 1 manifest dans le jar dans le dossier META-INF.
    Et le second à la racine du projet : Documents/MonProjet

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,

    Comment tu génères ton jar ?
    a++
    euh....
    J'avoue que je laisse Netbeans gérer cela.
    Il y a des fichiers .xml et .properties qui contiennent les instructions de compilation.
    A l'origine le projet a été créé sous Windows et j'ai copié le dossier dans Ubuntu, en vérifiant notamment la casse des fichiers et des dossiers ainsi que certaines instructions de compilation : sous Windows j'utilise le JDK 1.8 d'Oracle et sous Ubuntu c'est OpenJDK 1.7.

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    J'ai avancé :
    j'ai regardé le fichier project.properties de Netbeans et là j'ai vu que
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    manifest.file=manifest.mf
    j'ai donc modifié légèrement la ligne en :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    manifest.file=MANIFEST.MF
    et là effectivement l'information se retrouve copiée dans le fichier MANIFEST.MF du jar.

    Par contre, j'obtiens toujours NULL en sortie

  9. #9
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    J'avance tout doucement :
    j'ai exécuté ce code pour savoir ce que contient réellement le fichier MANIFEST :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
      InputStream is = getClass().getResourceAsStream("/META-INF/MANIFEST.MF");
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
     
      while ((line = br.readLine()) != null)
      {
        System.out.println(line);
      }

    dans la console j'ai (avec une ligne vide à la fin) :
    Manifest-Version: 1.0
    Created-By: 1.7.0_0 (Oracle Corporation)
    donc j'avoue que je suis perplexe
    J'ai décompressé l'archive, il n'y qu'un seul jar et il contient beaucoup plus d'informations. J'ai fait de même pour les librairies que j'importe et aucun manifest ne contient ces données.


    [edit]
    J'ai demandé à mon application d'afficher le chemin de la ressource :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.getClass().getResource("/META-INF/MANIFEST.MF").getPath();
    et là j'ai en sortie :
    file:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/localedata.jar!/META-INF/MANIFEST.MF
    Comment est-ce possible ?
    [/edit]

  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 Auteur Voir le message
    Comment est-ce possible ?
    Cela signifie que "/META-INF/MANIFEST.MF" n'est pas trouvé dans le Classloader de la classe courante... et qu'il est donc demander au Classloader parent (celui de la JVM).


    A quoi correspond "this" dans ton code ?
    Le manifest est bien présent dans le jar (attention aux différences de minuscule/majuscule).


    a++

  11. #11
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Citation Envoyé par adiGuba
    Cela signifie que "/META-INF/MANIFEST.MF" n'est pas trouvé dans le Classloader de la classe courante... et qu'il est donc demander au Classloader parent (celui de la JVM).
    C'est surprenant qu'il ne le trouve pas car au lancement de l'application un splash-screen s'affiche avec la bonne image (qui se trouve aussi dans le jar). Donc le MANIFEST est bien trouvé.

    Citation Envoyé par adiGuba
    A quoi correspond "this" dans ton code ?
    mon this est ma classe principale, celle qui contient le main.
    J'ai voulu remplacer this par MonProjet mais une erreur indique
    non-static method getClass() cannot be referenced from a static context
    Citation Envoyé par adiGuba
    Le manifest est bien présent dans le jar (attention aux différences de minuscule/majuscule).
    oui il est présent dans le dossier META-INF du jar. La casse est bien respectée.

  12. #12
    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
    Le con, pourquoi j'y ai pas pensé. Forcément dans a une chiée de MANIFEST.MF si t'as plusieurs jar => Savoir le quel on charge...... C'est aléatoire Bref ton code windows est "tombé en marche"

    Citation Envoyé par adiGuba Voir le message
    Cela signifie que "/META-INF/MANIFEST.MF" n'est pas trouvé dans le Classloader de la classe courante... et qu'il est donc demander au Classloader parent (celui de la JVM).
    Pas nécessairement ça peux simplement vouloir dire que le classloader qui a chargé son jar est le meme que celui qui a chargé le bootstrap. Plusieurs jars peuvent faire partie d'un même classloader, et donc la ressource Manifest.MF est loin d'être unique

    2 possibiltiés:

    utiliser Enumeration<URL> classloader.getRessources("META-INF/MANIFEST.MF") jusqu'à trouver le bon manifest.
    utiliser un autre nom de fichier pour stocker ton numéro de version (ma préférence ^^)

  13. #13
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Forcément dans a une chiée de MANIFEST.MF si t'as plusieurs jar => Savoir le quel on charge...... C'est aléatoire Bref ton code windows est "tombé en marche"
    pour Windows, tu es sûr ?

    Citation Envoyé par tchize_ Voir le message
    utiliser Enumeration<URL> classloader.getRessources("META-INF/MANIFEST.MF") jusqu'à trouver le bon manifest.
    comment ferais-tu cette énumération ? Peux-tu me donner un exemple de code ?

  14. #14
    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
    Je prendrais une à une chaque URL de l'énumération, je la filerais à la classe Manifest, et je m'arrêterais quand j'aurais trouvé le MAnifest qui contiens mes paramètres.

    Pour windows, disons que c'est possible que ton code marche, c'est pas garantis. Quand tu fais une getResourceAsStream et que plusieurs ressource correspondent au nom donné, il n'y a pas de mécanisme garantissant un ordre précis. Le hasard a fait que sous windows tu tombe sur le bon, peut être parce que les classloader sont un peu différents. Je vois que t'es sous openjdk sous linux et je parie que c'est une java de stock oracle sous windows

  15. #15
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    J'ai exécuté ce code
    Code java : 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
     
            try
            {    
                Enumeration<URL> en=MonProjet.class.getClassLoader().getResources("/META-INF/");
                if (en.hasMoreElements()) 
                {
                    URL metaInf=en.nextElement();
                    File fileMetaInf=new File(metaInf.toURI());
     
                    File[] files=fileMetaInf.listFiles();
                    for (int i=0; i<files.length;i++)
                    {
                        System.out.println(files[i].getPath());
                    }
     
                }
                else
                {
                    System.out.println("ko");
                }
     
            }
            catch (IOException ex)
            {
            } 
            catch (URISyntaxException ex) 
            {
            }

    Rien n'est trouvé Le message du else s'affiche dans la console.
    Pourtant j'ai encore vérifié dans l'archive, il y a bien un fichier dans le dossier META-INF.

  16. #16
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Enumeration<URL> en=MonProjet .class.getClassLoader().getResources("/META-INF/MANIFEST.MF");
    Aussi, n'utilise pas file!!

  17. #17
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Nouvel essai, sans succès.
    Je ne comprends vraiment pas ce qu'il se passe.
    Je testerai ce code sous Windows pour savoir ce qu'il me retourne.

    Sinon je vais recréer un nouveau projet sous Ubuntu avec un manifest pour voir ce que cela donne.

  18. #18
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Peut-on transférer la discussion dans le forum Netbeans car peut-être que le problème est au niveau de la configuration de cet IDE ?


Discussions similaires

  1. Lire une ligne précise dans un fichier de données
    Par IcArnus dans le forum Débuter
    Réponses: 7
    Dernier message: 05/04/2012, 23h25
  2. Comment lire une image contenue dans un fichier PDF
    Par colorid dans le forum Langage
    Réponses: 1
    Dernier message: 15/05/2009, 20h59
  3. Accéder à une donné X dans un fichier
    Par Baptiste Wicht dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 25/10/2006, 12h51
  4. Chercher une donnée existante dans un fichier
    Par BXDSPORT dans le forum Langage
    Réponses: 4
    Dernier message: 09/10/2005, 19h04
  5. Réponses: 5
    Dernier message: 16/03/2005, 23h17

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