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 :

Création Jar particulière


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Par défaut Création Jar particulière
    Bonjour,

    Alors voilà quand je veux faire un jar pour l'utilisateur, j'aimerais que ma ligne dans mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Thread.setDefaultUncaughtExceptionHandler(new ErrorHandler());
    se dé-commente.

    Elle permet de récupérer toutes les exceptions non attrapée "correctement" pour qu'elles soient mis dans un fichier de log.

    Seulement bien sur j'aimerais ne pas le faire à la maison a chaque fois.
    Peut être existe-t-il un outil qui permettrait de le faire via Ant ?

    Ps: J'utilise Eclipse

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Tu voudrais que lors de la creation du jar ca te decommente la ligne, fasse ton jar puis ensuite recommenter ton code??

    Sinon tu peux p'etre le faire avec un programme ou tu lui precises les fichiers ou sont presente les lignes commentés et qu'il faut qu'il les decommente. Et que seuleument ensuite il compiles tes class et construise ton jar et bien sur que ton prog fasse machine inverse une fois ton jar fini.

    Perso je ne connais pas d'outil permettant de faire cela....

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Pourquoi ne pas utiliser les propriétés Java ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	if (Boolean.getBoolean("DEBUG")) {
    		 Thread.setDefaultUncaughtExceptionHandler(new ErrorHandler());
    	}
    Ainsi, pour "activer" le log il faut utiliser l'option -D de la JVM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -DDEBUG=true -jar tonfichier.jar
    Note : sous eclipse, ce paramètre peut être ajouté dans l'onglets Arguments/VM arguments de la boite de dialogue "Run..."

    a++

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Pourquoi ne pas utiliser les propriétés Java ?
    A la lecture de ce thread j'avais pense a proposer un truc du genre.
    Sous delphi, on a des directives de compilation pour ce genre de choses, mais j'ai pas trouve d'equivament dans les recherches sous Java.

    C'est donc ca qui remplace les directives de compilation des langages Delphi, C++ , etc ... ?

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Clorish
    C'est donc ca qui remplace les directives de compilation des langages Delphi, C++ , etc ... ?
    Java ne possède pas de directives de compilation, mais il est possible d'utiliser les spécificités du compilateur pour aboutir à un résultat similaire.


    En effet, lors de la compilation, le compilateur supprimera toutes les bloc de code qui ne seront jamais accessible, par exemple lorsqu'on est sûr qu'on ne rentrera jamais dans un if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (false) {
        // ceci ne s'exécutera JAMAIS
    }
    Ainsi, dans ce cas le compilateur ne génèrera pas le bytecode associé à ce code.



    En l'utilisant conjointement avec des constantes (String ou type primitif en static final) on peut simuler une compilation conditionnelle.

    Par exemple on peut utiliser une classe définissant les constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Directive {
     
    	public static final boolean DEBUG = false;
     
    }
    Il suffit de l'utiliser dans un simple if pour que le code soit généré selon la valeur de la constante à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (Directive.DEBUG) {
    	// Ce code sera compilé ou non selon la valeur de la constante Directive.DEBUG
    }
    Attention, car lors d'une modification de la constante, il faudra recompiler tout le code et non pas seulement la classe dans laquelle elle est défini...


    Petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Main {
     
    	public static void main(String[] args) {
     
    		if (Directive.DEBUG) {
    			System.out.println("DEBUG");
    		}
     
    		System.out.println("FIN");
    	}
    }
    Si on compile avec DEBUG=false, on s'aperçoit très bien que le code du bloc if à disparu lorsqu'on décompile la classe (javap -c Main) :
    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
    javap -c Main
     
    Compiled from "Main.java"
    public class Main extends java.lang.Object{
    public Main();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   return
     
    public static void main(java.lang.String[]);
      Code:
       0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       3:   ldc     #3; //String FIN
       5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8:   return
     
    }
    La méthode main ne comporte que le code correspondant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("FIN");

    A l'inverse, lorsqu'on utilise DEBUG=true on retrouve les deux affichages :
    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
    javap -c Main
     
    Compiled from "Main.java"
    public class Main extends java.lang.Object{
    public Main();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   return
     
    public static void main(java.lang.String[]);
      Code:
       0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       3:   ldc     #3; //String DEBUG
       5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       11:  ldc     #5; //String FIN
       13:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       16:  return
     
    }
    A noter que si le corps du if est bien présent, l'instruction conditionnelle elle même n'est pas présent...

    a++

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par adiGuba
    Java ne possède pas de directives de compilation, mais il est possible d'utiliser les spécificités du compilateur pour aboutir à un résultat similaire.


    En effet, lors de la compilation, le compilateur supprimera toutes les bloc de code qui ne seront jamais accessible, par exemple lorsqu'on est sûr qu'on ne rentrera jamais dans un if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (false) {
        // ceci ne s'exécutera JAMAIS
    }
    Oui j'ai rencontre ce phenomene dans Delphi, sous le therme de "compilation optimisée" mais j'ai jamais fait le rapprochement .... Faut dire que si on a des directives ca sert a rien


    Citation Envoyé par adiGuba
    Attention, car lors d'une modification de la constante, il faudra recompiler tout le code et non pas seulement la classe dans laquelle elle est défini...
    Bien sur ... D'ailleur pour eviter tout problemes je supprime par batch tous les CLASS avant une compilation. J'ai trop souvent eu des heures de prise de tete sous Delphi a ne pas comprendre pourquoi un code modifié ne marchais pas avant de comprendre qu'il se basait sur une ancienne version pre-compilé.

    Citation Envoyé par adiGuba
    Si on compile avec DEBUG=false, on s'aperçoit très bien que le code du bloc if à disparu lorsqu'on décompile la classe (javap -c Main)
    A ce sujet petite question bete : On peux proteger son code ? avec un mdp dans un jar ou autre, car, on peux decompresser un jar et decompiler un CLASS .... c'est genant non ?

    Citation Envoyé par adiGuba
    A l'inverse, lorsqu'on utilise DEBUG=true on retrouve les deux affichages [...]
    A noter que si le corps du if est bien présent, l'instruction conditionnelle elle même n'est pas présent...
    Normal .... optimisation de code

Discussions similaires

  1. [jar] Création jar
    Par Fellag dans le forum Général Java
    Réponses: 4
    Dernier message: 01/08/2007, 16h21
  2. création jar/executable main ?
    Par samtheh dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 31/03/2007, 14h34
  3. Copie + création .jar
    Par zent dans le forum ANT
    Réponses: 6
    Dernier message: 08/01/2007, 14h13
  4. prblème création Jar file
    Par phileme dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/06/2006, 22h19
  5. Réponses: 6
    Dernier message: 12/06/2006, 17h38

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