2010-02-26 17 views
0

Je voudrais faire une compilation conditionnelle dans un de mes programmes. Je sais que si vous déclarez un booléen public static final, le compilateur ignorera la branche qui n'est pas traversée. Est-il possible d'avoir une variable de fourmis avant de construire le programme?Est-il possible de modifier le code source avec ant?

Par exemple, si j'ai:

final public static boolean windows = false;

Je voudrais deux cibles ant: Windows et Mac. Je voudrais que la commande ant windows changer le booléen true, alors que ant mac quitte la variable est.

Merci.

+1

Est-ce vraiment nécessaire? Pourquoi ne pas simplement charger le booléen une fois au démarrage à partir d'un fichier de configuration? Pensez à ce que vous gagnez (l'évaluation d'une variable booléenne non-statique non-statique à l'exécution n'a pas de coût réel), par rapport à l'impact que cela a sur votre processus de construction. – Thilo

+0

@Thilo - Le point est de ne pas avoir du tout le code dans le pot. Le fichier de propriétés n'atteint pas vraiment ce but, une bonne idée néanmoins. – kgrad

+0

S'il s'agit de larges bandes de code, la délocalisation provoquée par le code mort au milieu peut être assez significative en termes de performances. –

Répondre

11

Vous pouvez obtenir Ant pour modifier un fichier de propriétés, et vous pouvez lire assez facilement ce fichier dans votre application:
new Properties(new FileInputStream("filename"/new File(filename))),

et lire les propriétés en utilisant:
Boolean isWindows = new Boolean(properties.getProperty("windows"))

ou:
String os = properties.getProperty("os"). Vous pouvez utiliser la tâche Ant PropertyFile pour ce faire: http://ant.apache.org/manual/Tasks/propertyfile.html.

Edit: voici une alternative utilisant une autre tâche si vous devez absolument modifier le fichier de code source en utilisant Ant:

<replaceregexp file="blah.java" match="public static final boolean WINDOWS = \"(.*)\"" replace="public static final boolean WINDOWS = \"" + ${properties.windows} + "\"" />
- remplacer le code comme votre propre au besoin. Voir http://ant.apache.org/manual/Tasks/replaceregexp.html pour plus de détails.

+0

+1. Cela devrait être une propriété, pas compilée. L'avantage de performance du fait que le compilateur supprime le code non utilisé est négligeable. – Thilo

+0

Le replaceregexp a parfaitement fonctionné pour ce que j'ai décrit. – kgrad

+0

Woot - heureux que cela a fonctionné pour vous :) –

1

Ignorer les fichiers ant et property, etc. Java le fait déjà!

Utilisez quelque chose comme System.getProperty ("os.name");

+0

La détection de Windows était juste un exemple – kgrad

1

Vous devriez lire attentivement les autres réponses et voir s'il y a une meilleure solution pour vous. Cependant, Ant a une tâche pour remplacer le texte dans les fichiers. Par exemple:

< remplacer file = "$ {src} /MyFile.java" jeton = "windows Boolean = true" value = "windows Boolean = false"/>

1

Les propriétés et les remplacer tâches devrait vous obtenez ce dont vous avez besoin. Je suis d'accord que trouver une approche différente est une bonne idée.

Cependant, si pour une raison quelconque les tâches intégrées ne vous permettent pas d'obtenir ce dont vous avez besoin, il est assez facile d'écrire une tâche personnalisée pour la fourmi. Voir http://ant.apache.org/manual/develop.html

0

Vous pouvez également fournir la valeur command-lind en tant qu'argument lors de l'appel du programme principal Java à partir de Ant.

Par exemple. ant -f build.xml "YouranttaskName" -Doperatingsys="windows"

Construction interne.xml

<target name="YouranttaskName"> 
<java classname="javaclassname" fork="true" > 
<arg value="${operatingsys}" /> 
</java> 
</target> 

Inside java -main méthode cette valeur d'argument sera disponible dans le même ordre .i.e. args [0] contient "Windows".

Vous pouvez écrire votre logique en considérant quelle est la valeur par défaut de votre système d'exploitation, car l'utilisateur ne peut pas fournir d'argument de ligne de commande, puis définir le paramètre 'boolean flag' en conséquence.