2010-04-08 9 views
0

Je souhaite inclure un fichier default.properties dans ma bibliothèque .jar. L'idée est de permettre à l'utilisateur de remplacer ma valeur par défaut s'il le souhaite. J'ai du mal à faire en sorte que le classloader joue bien avec cette configuration, j'ai essayé de regarder des fichiers populaires tels que log4j, common- * et d'autres et il semble que personne n'implémente cette idée. Est-ce que je vais dans le mauvais sens?Envoi d'un fichier jar avec les configurations de fichier par défaut .properties

La deuxième meilleure chose est difficile coder les valeurs, et en utilisant la valeur par défaut si aucune touche .properties a été trouvé, mais ce son oh si mal.

Suggestions?

Répondre

0

Je trouve votre design correct et bon. log4j ne fait pas ça et je les maudis toujours que j'ai besoin de rappeler leur syntaxe de configuration et que je ne peux pas aller avec de jolis paramètres par défaut (je connais BasicConfigurator, mais c'est trop simple).

Et je crois que de nombreux frameworks web regroupent leur configuration par défaut dans leurs pots.

Quels problèmes rencontrez-vous avec classloader?

0

Vous pouvez soit lire le fichier de configuration utilisateur à partir du classpath ou du système de fichiers.

l'approche du système de fichiers est de regarder dans un endroit prédéterminé (répertoire courant,/etc/ou autre) pour le fichier de configuration et s'il manque à lire celui dans le pot. vous pouvez même inclure une commande pour créer un fichier de configuration par défaut (en tant que fichier). L'approche classpath est plus délicate, car votre application n'en a pas le contrôle total. l'idée est que l'emplacement où l'utilisateur est censé localiser son fichier de configuration doit être AVANT le jar lui-même dans le classpath. Vous pouvez demander à l'utilisateur de manipuler le classpath (ce qui n'est pas une bonne idée) ou envoyer votre jar avec un classpath approprié (entrée Class-Path dans le manifeste). Je ne suis pas sûr si c'est possible parce que je m'attends à ce que les entrées de classpath dans le manifeste soient ajoutées au chemin de classe et non pré-configurées.

0

Vous pouvez utiliser ClassLoader pour lire les fichiers que vous avez dans le classpath de votre jar. Par exemple, si vous avez un test de classe, et que vous voulez lire un fichier qui se trouve dans le même répertoire que vos paquets, vous pouvez utiliser les éléments suivants:

Test.class.getClassLoader().getResourceAsStream("test_file.txt") 

Vous pouvez analyser ce flux d'entrée en utilisant vos lecteurs standards :

new BufferedReader(new InputStreamReader(Test.class.getClassLoader().getResourceAsStream("test_file.txt"))) 

Enfin, si votre fichier se trouve dans l'un de vos colis (TestCom), vous spécifiez le chemin comme suit:

new BufferedReader(new InputStreamReader(Test.class.getClassLoader().getResourceAsStream("com/test/test_file.txt"))) 
1

Je préfère garder les valeurs par défaut et remplacements dans separa les fichiers.

Disons que vous avez un fichier mysettings.properties. Je diviserais cela en deux. mysettings-default.properties et mysettings.properties.

La valeur par défaut doit être incluse dans le fichier jar et expédiée. L'utilisateur peut remplacer les valeurs par défaut en fournissant mysettings.properties dans divers endroits - comme classpath, ou le répertoire de travail actuel, ou l'utilisateur.dir ou via un remplacement personnalisé -Dsettings.path =/path/to/file. De cette façon, vous avez des valeurs par défaut raisonnables pour les fainéants, et une manière très flexible de remplacer si nécessaire.

Le code est assez simple.

  1. Créer un objet Propriétés correspondant à MySettings-defaults
  2. de MySettings de chargement Essayez de divers endroits. Le premier gagne. Chargez ceci dans un objet de propriétés séparé.
  3. Fusionner l'objet de deux propriétés. Ce sont essentiellement des cartes, donc addAll fonctionne. Faites attention à la commande.

C'est tout! Vous avez un système hautement configurable avec des valeurs par défaut raisonnables.