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]Constantes Java [Infos]


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut [JAR]Constantes Java
    Bonjour,

    j'ai l'impression que lors de la compilation du code Java, les constantes sont remplacées par leurs valeurs.

    Pb : En simplifiant
    Utilisation de 2 jars (1 contenant les constantes et 1 autre faisant appel à ces constantes).
    Si je modifie les valeurs des constantes et que je recompile le jar contenant les constantes, l'autre jar ne prend pas en compte les modifications.
    Pour que les modifications soient prises en compte, il faut que je recompile le jar faisant appel à ces constantes.

    Est ce normal ?
    Y a t'il une solution pour éviter d'avoir besoin de tous recompiler ?

    merci par avance

    Arnaid







    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Oui c'est exact, les constantes sont remplacées par leurs valeurs lors de la compilation de tes classes...

    TU pourrais essayer d'externaliser tes constantes dans un fichier xml ou properties...

  3. #3
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Euh attends là ...
    si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class MesConstantes
    {
       public int MA_CONSTANTE = 1;
    }
     
    public class MaClasse
    {
       public MaClasse()
       {
           int maVar = MesConstantes.MA_CONSTANTE;
       }
    }
    Si tu changes la valeur de MA_CONSTANTE et que tu lui donnes 2 au lieu de 1 et que tu recompiles le fichier MesConstantes SANS recompiler MaClasse, tu auras toujours maVar = 1 ???? je crois pas ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    C'est ce qui m'arrive !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Ce n'est pas trop lourd pour les performances de passer par le chargement de fichier xml ou deproperties ?

    Arnaud

  6. #6
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    attends je teste parce que là j'y crois pas !!

  7. #7
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Ben non absolument pas, un l'exploitation d'un .properties ou d'un .xml se fait trés facilement et selon le parser l'exploitation du xml est plus ou moins efficace...

    De plus il est conseillé d'externaliser au maximum les constantes...

    Imagines que tu aie ces deux classes dans deux jars différents:

    jar1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MesConstantes 
    { 
       public int MA_CONSTANTE = 1; 
    }
    jar2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MaClasse 
    { 
       public MaClasse() 
       { 
           int maVar = MesConstantes.MA_CONSTANTE; 
       } 
    }
    A la compilation dur jar2 tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MaClasse 
    { 
       public MaClasse() 
       { 
           int maVar = 1; 
       } 
    }
    Or si tu changes MA_CONSTANTE de 1 en 2 et que tu ne recompile pas le jar2 et bien tu auras un décalage... IL faut faire une sorte d'édition de liens un peu comme les makefile du c, tu peux gérer ça avec Ant...

  8. #8
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    attends je teste parce que là j'y crois pas !!

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 95
    Par défaut
    Tu peux aussi supprimer le bug en recompilant toutes tes classes à chaque fois. Mais le mieux est quand même d'externaliser tes constantes dans un fichier properties ou xml.

  10. #10
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Dites euh j'ai vérifié et je suis pas d'accord. Soit y a quiproquo soit y a bug !! Parce que chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MesConstantes
    {
      public static int MA_CONSTANTE=1;
     
    }
    dans le fichier constantes.jar

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class TestMesConstantes
    {
      public static void main(String[] args)
      {
      	System.out.println("Valeur ="+MesConstantes.MA_CONSTANTE);
      }
    }
    dans le fichier testconstantes.jar

    donne:
    Valeur=1
    si je l'exécute comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -cp mesconstantes.jar;testmesconstantes.jar TestMesConstantes
    et si je change la valeur et que je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MesConstantes
    {
      public static int MA_CONSTANTE=2;
     
    }
    dans le fichier constantes.jar SANS toucher à testconstantes.jar et que je relance le tout j'obtient bien
    Valeur=2
    Es-tu sûr que tes jar sont bien écrasés à chaque modification ??

  11. #11
    Invité de passage
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1
    Par défaut
    Juste en passant...

    Ca donne le tourni d'externaliser des constantes pour avoir la possibilité de changer leur valeurs .Si les constantes deviennent des variables, on ne peut plus se fier à rien !

    Cela dit, le remplacement d'une constante par sa valeur est censé être une optimisation du compilateur (pas d'emplacement mémoire utilisée) mais abouti à ce genre d'imprévu.

    Bonne journée,
    ----------------------------------
    Lionel Badiou
    CodeFutures -
    Java Code Generation

    http://www.codefutures.com

  12. #12
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    On externalise des constantes quand on a pas le temps de se faire chier à faire un .property ou un xml. C'est une bonne façon de tester rapidement en recompilant juste les paramètres diverses configuration sans devoir les passer en paramètre à un main.
    CEPENDANT c'est une solution temporaire qui doit être rapidement remplacées par un property ou un xml.

    Le fait de passer D'ABORD par un fichier de constantes externalisé permet cependant de mieux appréhender le passage en fichier de paramètre. Après c'est un choix, rien d'obligatoire.

    Pour terminer je vois pas comment la valeur d'un attribut d'une classe située dans un jar peut être remplacée par une constante lors de la compilation d'un autre jar... Si effectivement ça existe, c'est pas très très malin... Dans ce cas on met tout dans le même jar !

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Par défaut
    Rajoute final pour faire le test :

    public static final int MA_CONSTANTE=1;

  14. #14
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    ah oui avec final forcément ! Je crois que c'est le but de final, de ne pas permettre d'autre valeur pour une constante que celle de la compilation et de ne pas pouvoir être surchargée par une classe fille...

    EDIT:
    Et je confirme avec le test, final fige bien la valeur à la compilation.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 95
    Par défaut
    CEPENDANT c'est une solution temporaire qui doit être rapidement remplacées par un property ou un xml.
    Pas forcément. Il arrive que parfois, on ne veut pas de constantes en dehors du programme dans un fichier xml ou properties. Par exemple, une valeur à laquelle on interdit la modification ou même la consultation par l'utilisateur. J'ai un exemple concret sous la main : un programme qui se connecte à une BD, mais dont on ne veut pas que les codes d'accès soient visibles, ni même modifiables.

  16. #16
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Tu vas rire mais j'ai EXACTEMENT le même exemple. J'ai mis les constantes dans une classe à part comme ça mon boss à qui je laisse le projet a juste à modifier cette classe, à cliquer sur CP.bat et create_jar.bat puis à remplacer le jar et c'est bon. Mais comme le disait un ami à moi, une bonne décompilation et c'est finit donc ... En tout cas elles ne sont pas en final mes constantes.

  17. #17
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Les constantes doivent être en final static...

  18. #18
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Ca dépend, il existe des cas (celui là par exemple) où on préférera ne pas les mettre en final.

Discussions similaires

  1. [iBatis] Utilisation de constante Java dans requête Ibatis
    Par ALX79 dans le forum Persistance des données
    Réponses: 3
    Dernier message: 16/09/2009, 14h53
  2. Problème de signature de Jar avec java webstart
    Par JCD21 dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 07/06/2008, 22h20
  3. coment creer un fichier Jar en java?, debutant
    Par Mobistar dans le forum Langage
    Réponses: 14
    Dernier message: 14/11/2007, 13h36
  4. deploiement jar et java.lang.NoClassDefFoundError
    Par Sniper37 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 11/06/2007, 12h02
  5. Réponses: 10
    Dernier message: 24/05/2005, 14h09

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