2010-02-10 8 views
1

Je construis une application Java (en utilisant Ant avec les fichiers build.xml et build.property). Maintenant, j'aimerais pouvoir créer une autre version de "débogage" qui imprime plusieurs messages de diagnostic à System.err. Ceci est réalisé par quelque chose comme ceci (simplifié):Création de différentes versions de construction d'une application Java

private static final boolean DEBUG = false; 

public static void debug (String msg) { 
    if (DEBUG) { 
     System.err.println(msg); 
    } 
} 

Est-il possible d'influencer la valeur de la constante DEBUG au moment de la construction? Je suppose que ce que je cherche est l'équivalent Java pour les définitions de préprocesseur C. Idéalement, j'aurais une cible de construction différente dans le fichier build.xml, ce qui définirait DEBUG sur true et créerait un myapp-debug.jar en sortie.

Une utilisation connexe de ceci serait le nom du fichier de configuration que l'application utilise. Ceci est également spécifié comme une constante statique dans le code source, mais je préférerais qu'il soit ajustable au moment de la construction.

Désolé si cela est évident pour vous, je ne suis pas un expert :)

+0

Quelle est votre exigence pour plusieurs versions? Pourquoi ne pas avoir une seule construction où vous pouvez activer ou désactiver DEBUG à l'exécution? –

Répondre

2

Il n'est pas rare de contrôler les options de consignation via un fichier de configuration .properties.

Vous pouvez lire le chargement d'un fichier de propriétés, et si le chargement réussit (afin que le fichier ne soit pas obligatoire), utilisez une propriété qui contrôle la journalisation.

+0

oh désolé je viens de poster une réponse similaire pendant que vous répondiez à cette question .... désolé pour la redondance. – fasseg

+0

Je pense que vous avez raison: les fichiers de propriétés sont la solution. J'avais l'impression erronée que cela ne ferait que repousser le problème à un niveau, parce que j'aurais codé en dur le nom/emplacement du fichier de propriétés, mais je me suis souvenu que je pouvais juste le chercher dans le classpath (y compris l'application JAR, s'il y en a un). Merci! – Zilk

1

build Java avec le principe de « construire une fois, exécuter partout », donc javac n'a pas un préprocesseur, et vous ne peut pas changer la variable au moment de la compilation d'une autre manière que d'avoir une seule définition de la variable quelque part, et de la changer dans le fichier source avant la compilation. Si vous ne faites cela qu'à des fins de consignation, vous devriez probablement regarder dans le paquet java.util.logging. Si vous souhaitez que des contrôles spécifiques soient exécutés lors de l'exécution et qu'ils puissent être désactivés pour les environnements de production, consultez les informations sur Java assertions.

1

Je pense qu'il serait plus facile d'externaliser la variable dans un fichier texte Java Properties. Vous pouvez ensuite charger une propriété définie à partir d'un fichier * .property ou d'un fichier XML et faire dépendre la logique de l'application de cette propriété.

quelque chose comme ça dans un fichier application.properties:

application.log.level=DEBUG 

qui est ensuite chargé en utilisant la méthode de la classe Propriétés load():

Properties props = new Properties(); 
props.load(new FileInputStream("application.properties")); 
String debugLevel=props.getProperty("application.log.level"); 
boolean debug; 
if (debugLevel!=null && debugLevel.equals("DEBUG")) { 
    debug=true; 
} 
6

Je vous recommande log4j si C'est le seul problème que vous avez.

Vous êtes susceptible d'avoir d'autres paramètres, tels que des connexions de base de données et de file d'attente, etc. Ceux-ci doivent tous être externalisés dans une configuration que vous pouvez varier en fonction de l'environnement.

+0

..ou son nouveau logback: http://logback.qos.ch (+1). – BalusC

Questions connexes