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 :

Pointeur nulle avec getRessource


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Points : 52
    Points
    52
    Par défaut Pointeur nulle avec getRessource
    Bonjour,

    Je me suis depuis peu sous maven et j'essaie de déployer une application. J'utilise pour cela un assembly pour composer mon zip livrable dont voici l'arborescence:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    resources
    --- application
        --- *.mdl
    --- configTresos
        --- *.mdl
    --- config.xml
    --- log4j.properties
     
    lib
    --- *.jar
     
    appli.jar
    Le pom est configuré de sorte à générer un manifest dont voici le contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Built-By: Hsmr
    Class-Path: resources/ lib/toolbox-1.0.0.jar lib/jep-2.24.jar lib/jdom
     -1.1.jar lib/jxl-2.6.3.jar lib/log4j-1.2.14.jar
    Created-By: Apache Maven 3.2.3
    Build-Jdk: 1.8.0_25
    Main-Class: com.valeo.devsrv.main.Main
    Dans ma classe main, je configure mon logger de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static void main(String[] args) {
     
    		//configure le logger
    		PropertyConfigurator.configure(Main.class.getResource("/log4j.properties").getFile());
     
    ...
    Un coup de mvn install me génère bien mon zip comme voulu. Mais quand je lance le jar dans une console j'ai le message suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exception in thread "main" java.lang.NullPointerException
            at com.valeo.devsrv.main.Main.main(Main.java:26)
    La ligne incriminée correspond bien à la ligne où je configure mon logger. Je comprends que l'appel à getResource n'arrive pas à trouver le fichier log4j.properties. Le pourquoi je n'arrive pas à me l'expliquer et ce malgré mes recherches sur le net. Le répertoire resources contenant le *.properties est bien renseigné dans le class-path du manifest généré.

    Merci pour votre aide.

    Cdt

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Si tu utilises log4j, tu n'as pas besoin normalement de "charger" programmatiquement le fichier de properties : il suffit d'avoir le jar de log4j dans le classpath et le fichier de properties dans le jar.

    Et dans un zip, tu ne peux pas récupérer de fichiers via un "getResource(XXX).getFile()", au mieux tu peux récupérer le contenu par getResourceAsStream
    Je ne suis pas mort, j'ai du travail !

  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,


    Je peux me tromper mais il me semble que le Class-Path du Manifest attend uniquement des archives (jar/zip) et non pas des répertoires...


    a++

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Si tu utilises log4j, tu n'as pas besoin normalement de "charger" programmatiquement le fichier de properties : il suffit d'avoir le jar de log4j dans le classpath et le fichier de properties dans le jar.

    Et dans un zip, tu ne peux pas récupérer de fichiers via un "getResource(XXX).getFile()", au mieux tu peux récupérer le contenu par getResourceAsStream
    Merci de t'intéresser à mon problème.
    Oui j'utilise log4j, et j'ai bien le jar de log4j dans le classpath.
    L'idée est de déporter le fichier de properties hors du jar, ceci afin de faciliter le changement de configuration du logger sans avoir à reconstruire le jar.
    Une simple modification du fichier properties à la main suffirait à reconfigurer le logger sans recompiler ou regénérer le jar. Raison pour laquelle je déporte le fichier properties dans le répertoire resource.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2002
    Messages : 62
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Je peux me tromper mais il me semble que le Class-Path du Manifest attend uniquement des archives (jar/zip) et non pas des répertoires...


    a++
    C'est bien l'impression que j'ai.
    J'ai l'impression que dans le class-path du manifest on ne peut qu'indiquer les répertoires qui sont des jar (ne sais pas pour les zip). Et que tous les getRessource(XXXX).getFile() recherche les chemins à partir des jars indiqués dans le class-path. Bon c'est juste une impression.

    Mais mon souhait est de déporter toutes les ressources utiles pour l'appli hors des jar. Ceci afin de permettre de changer le comportement de l'application sans avoir à le recompiler mais juste en modifiant à la main les ressources utilisées.

    Y a t il d'autres attributs pour le manifest permettant d'indiquer à la JVM un répertoire contenant les ressources utiles à l'exécution de l'application, et tout en gardant dans le code source, l'appelle du getRessource(XXXX).getFile() ?

  6. #6
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Si tu veux juste pouvoir utiliser un fichier de properties en DEHORS de ton jar, tu n'as... rien à faire.
    Place ton fichier log4j.properties au niveau de ton jar (dans le même répertoire) et il devrait être pris en compte automatiquement. Log4j va par défaut chercher un fichier qui s'appelle log4j.properties dans le classpath, et il va le trouver tout de suite (vu qu'il sera au même niveau que ton jar)
    Je ne suis pas mort, j'ai du travail !

  7. #7
    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 hsmr Voir le message
    getRessource(XXXX).getFile()
    Attention à getRessource().getFile() car cela ne correspond pas forcément à un chemin vers un fichier !
    getRessource() retourne une URL et getFile() son chemin. Avec une URL de protocol "file" ca marche mais ce n'est pas forcément le cas avec d'autres protocoles.
    Il est préférable d'utiliser l'URL directement c'est plus portable...



    Sinon apparemment je me trompais : on peut bien utiliser des répertoires dans le class-path du manifest : http://todayguesswhat.blogspot.fr/20...ferencing.html
    Du coup vérifies bien tes chemins et tes noms de fichier, tout comme le retour de getResource()


    a++

Discussions similaires

  1. Problème de pointeur null avec Spring
    Par Psycho185 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 13/09/2013, 20h04
  2. Probleme de NULL avec LEFT OUTER JOIN
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 14h42
  3. Réponses: 8
    Dernier message: 11/08/2005, 09h32
  4. [Info][Mémoire] utilisée pour un pointeur null
    Par thomas_strass dans le forum Langage
    Réponses: 14
    Dernier message: 04/11/2004, 12h48
  5. Réponses: 4
    Dernier message: 06/04/2004, 21h57

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