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

Spring Java Discussion :

[CLASSPATH][PROPERTIES] probleme declaration classpath [Framework]


Sujet :

Spring Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut [CLASSPATH][PROPERTIES] probleme declaration classpath
    Bonjour tout le monde,

    J'ai une application java 1.5 utilisant spring ioc.
    J'ai mis cette application sous forme de jar (monAppli.jar).
    Tous mes fichiers de type properties sont dans un dossier à part, ils ne font pas partis du jar.
    Mon arborescence est la suivante:

    monDossier
    |
    |--->monAppli.jar
    |--->dossierProperties

    Mon principal problème vient que je me perds un peu dans la déclaration des paths concernant ces fichiers de properties.

    Dans le fichier de config de spring que j'ai appelé configSpring.xml, j'ai besoin des valeurs de certains fichiers properties. Pour cela j'utilise PropertyPlaceholder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
            <property name="locations">
           	      <list>
                      <value>c:/monDossier/dossierProperties/jdbc.properties</value>
                      <value>c:/monDossier/dossierProperties/data.properties</value> 
                  </list>
         </property>
    </bean>
    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="url"> <value>${jdbc.url}</value></property>
    ....
    En gros j'ai l'impression que ça ne marche pas parce que mon dossier ne fait pas parti du classpath.J'ai beau essayer de l'ajouter je n'y arrive pas, toujours la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [c:/monDossier/dossierProperties/jdbc.properties] cannot be opened because it does not exist
    J'ai beau avoir rajouter le dossier dans le CLASS-PATH au niveau du fichier manifest, et même quand je lance par la commande java -classpath ...

    Je suis preneur de bons conseils et de solution saussi

    Merci.

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Salut,

    Essaie plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
            <property name="locations">
           	      <list>
                      <value>c:/monDossier/dossierProperties/jdbc</value>
                      <value>c:/monDossier/dossierProperties/data</value> 
                  </list>
         </property>
    </bean>
    Ou encore mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
            <property name="locations">
           	      <list>
                      <value>dossierProperties/jdbc</value>
                      <value>dossierProperties/data</value> 
                  </list>
         </property>
    </bean>
    A+

  3. #3
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Essaie ceci si les code précedent ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
            <property name="locations">
           	      <list>
                      <value>file:c:/monDossier/dossierProperties/jdbc</value>
                      <value>file:c:/monDossier/dossierProperties/data</value> 
                  </list>
         </property>
    </bean>
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Je viens de regarder mon projet, et voila la bonne définition, en fonction du context tu peux utiliser via le classpath ou avec un chemin de fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    		<property name="ignoreResourceNotFound" value="true" />
    		<property name="locations">
    			<list>
    				<value>classpath:config.properties</value>
    				<value>file:/c:/conf/config.batch.properties</value>
    			</list>
    		</property>
    	</bean>

  5. #5
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    Merci ca marche ^^

    Sinon une autre petit question: VU que spring utilise les valeurs des fichiers properties, comment faire pour récuperer ces fichiers de properties dans mes class java ? D'ailleurs est ce possible ?
    J'ai vu qu'il existait une class PropertiesFactoryBean j'ai instancier cette class avec mes fichiers properties mais je vois aucune méthode pour récuperer ce que je veux dans mes fichier properties, tout comme la classe PropertyPlaceholderConfigurer


    Merci.

  6. #6
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Salut,

    Pour utiliser facilement les properties dans une classe Java classique via Spring, il existe un moyen simple :

    Premièrement tu déclares un bean qui va pointer sur tes fichiers properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    		<property name="basenames">
    			<list>
    				<value>package/fichier</value>
    				<value>package2/fichier2</value>
    			</list>
    		</property>
    	</bean>
    Ma confusion précèdente était liée à la définition de ce bean, différente du PropertyPlaceholderConfigurer.

    Ce type de bean, est utilisé en général pour l'internationalisation.

    Pour l'utiliser, il suffit alors que ta classe Java "implements MessageSourceAware". Il faut aussi qu'elle soit déclarée dans un context spring en tant que bean, afin qu'elle soit injectée automatiquement.

    Tu dois déclarer un attribut de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.context.MessageSource
    Avec son setteur.

    Ensuite, tu peux regarder les méthodes proposées, notamment les getMessage.

    En fonction de la Locale passée en paramètre, le message sera trouvé, par exemple pour le properties fichier que j'ai définie plus haut dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "package/fichier.properties" // si aucune locale passée ou si la locale n'existe pas
    "package/fichier_en_US.properties" // si la locale en_US est passée.
    voila j'espère que ça va t'aider
    A+

  7. #7
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    Je comprend mais ça ne marche pas, il me dit qu'il trouve pas mon fichier.

    Je récapitule: j'ai dans mon dossier properties tous mes fichiers qui ne font pas partis du classpath

    Je déclare mon bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    		<property name="basenames">
    			<list>
           			<value>c:/properties/jdbc.properties</value>
           			<value>c:/properties/unAutre.properties</value>
    			</list>
    		</property>
     </bean>
    J'ai déclaré mon attribut (MessageSource messageSource) avec le setteur et je l'injecte tout beau tout propre dans ma class java qui implemente MessageRessourceAware

    Quand je veux récupérer une valeur je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    messageSource.getMessage("jdbc.url", null,null));
    et j'ai comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    2007-11-16 13:53:18 FATAL [BusinessImpl] Exception when trying to execute sendMail()
    org.springframework.context.NoSuchMessageException: No message found under code 'jdbc.url' for locale 'null'.
    	at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:179)
    	at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:986)
    	at com.atosorigin.artemis.views.batch.business.BusinessImpl.sendMail(BusinessImpl.java:56)
    	at com.atosorigin.artemis.views.batch.main.Main.main(Main.java:23)
    J'ai aussi essayé avec <value>file:....</value> mais ça ne marche pas aussi
    Je me demande si il faut pas que mes fichiers soient dans le classpath.

  8. #8
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    		<property name="basenames">
    			<list>
           			<value>c:/properties/jdbc</value>
           			<value>c:/properties/unAutre</value>
    			</list>
    		</property>
     </bean>
    ET comme ca?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  9. #9
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    non toujours pas

  10. #10
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    En lisant la javadoc j'ai comme l'impression que les fichiers doivent faire partie du classpath
    MessageSource implementation that accesses resource bundles using specified basenames. This class relies on the underlying JDK's ResourceBundle implementation, in combination with the JDK's standard message parsing provided by MessageFormat.

    et plus loin:
    setBasename

    public void setBasename(String basename)

    Set a single basename, following ResourceBundle conventions: essentially, a fully-qualified classpath location. If it doesn't contain a package qualifier (such as org.mypackage), it will be resolved from the classpath root.

    Messages will normally be held in the "/lib" or "/classes" directory of a web application's WAR structure. They can also be held in jar files on the class path.

    Note that ResourceBundle names are effectively classpath locations: As a consequence, the JDK's standard ResourceBundle treats dots as package separators. This means that "test.theme" is effectively equivalent to "test/theme", just like it is for programmatic java.util.ResourceBundle usage.

  11. #11
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Regarde bien la définition des valeurs, elle est spécifique, et dépendante du classpath, et non du système de fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    		<property name="basenames">
    			<list>
           			<value>properties/jdbc</value>
           			<value>properties/unAutre</value>
    			</list>
    		</property>
     </bean>
    Ceci, si ton fichier properties se trouve dans le package properties. Il ne faut pas mettre l'extension properties.

    A+

  12. #12
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    ca ne marche toujours pas.
    Ca a marché une fois quand mes properties étaient dans le classpath

  13. #13
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    D'un autre coté, les ResourceBundle c'est pour l'i18n.

    Injection simplement un Properties ne suffit pas ?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  14. #14
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Citation Envoyé par Hikage Voir le message
    D'un autre coté, les ResourceBundle c'est pour l'i18n.

    Injection simplement un Properties ne suffit pas ?
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <bean id="myProperties" class="org.springframework.beans.factory.config.Pr opertiesFactoryBean">
    <property name="location">
    <value>c:/properties/jdbc</value>
    <value>c:/properties/autres</value>
    </property>
    </bean>
    De la, tu peux injecter le bean myProperties dans une propriété de type Properties
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  15. #15
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Je dirais plutôt un truc comme ça non ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        <value>file:/c:/properties/jdbc.properties</value>

  16. #16
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Oui, comme cela c'est sur .. vu que je ne sais pas comment il l'interprete de base : ClasspathRessource ( classpath:/ ) ou FileSystemResource ( file:/ )


    EDIT :
    Allows for making a properties file from a classpath location available as Properties instance in a bean factory. Can be used to populate any bean property of type Properties via a bean reference.
    Donc oui, il faut bien préfixé de file:/
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  17. #17
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 57
    Par défaut
    Et voila ca marche merci beaucoup à vous deux pour le temps passé!
    Donc finalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	 <bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    		<property name="locations">
    		<list>
    	       		<value>file:properties/jdbc.properties</value>
           			<value>file:properties/exceptions.properties</value>
           			<value>file:properties/queries.properties</value>
    	    </list>
    		</property>
    	</bean>
    Vu que j'ai mon fichier jar au même niveau que mon dossier properties ça passe

    Puis apres dans ma class java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Properties myProperties;
    et le setteur qui va avec .

    Merci pis ca pourrait être rajouter dans la fac ça

  18. #18
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Content que ça fonctionne, et pourquoi pas pour la FAQ, ça peut être utile à d'autres

    Je marque ton post en résolu.

    A+

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

Discussions similaires

  1. Génération d'un jar : Probleme de classpath ?
    Par boby62423 dans le forum Langage
    Réponses: 4
    Dernier message: 13/05/2009, 13h04
  2. probleme de classpath avec un jar
    Par lahoucineinfo dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2008, 13h03
  3. Problème de classpath
    Par ekard dans le forum ANT
    Réponses: 10
    Dernier message: 05/10/2006, 10h28
  4. Probleme de classpath
    Par Toulzac dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 20/04/2006, 11h31
  5. [Classpath][packages] problème de lancement de l'appli
    Par gogozep001 dans le forum Général Java
    Réponses: 11
    Dernier message: 19/05/2005, 23h35

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