Cadre de configuration Java

Je suis en train d’éliminer toutes les valeurs codées en dur dans une bibliothèque Java et je me demandais quelle infrastructure serait la meilleure (en termes de configuration nulle ou proche de zéro) pour gérer la configuration d’exécution? Je préférerais les fichiers de configuration basés sur XML, mais ce n’est pas essentiel.

S’il vous plaît ne répondez que si vous avez une expérience pratique avec un cadre. Je ne cherche pas d’exemples, mais de l’expérience …

Si vos valeurs codées en dur ne sont que de simples paires clé-valeur, vous devriez regarder java.util.Properties . C’est beaucoup plus simple que XML, plus facile à utiliser et sortingvial à mettre en œuvre.

Si vous travaillez avec Java et que les données que vous stockez ou récupérez à partir du disque sont modélisées comme une paire de valeurs clés (ce qui semble être le cas dans votre cas), je ne peux vraiment pas imaginer une meilleure solution.

J’ai utilisé des fichiers de propriétés pour la configuration simple de petits paquets dans un projet plus grand, et comme une configuration plus globale pour un projet entier, et je n’ai jamais eu de problème avec cela.

Bien sûr, cela a le grand avantage de ne pas utiliser de bibliothèques tierces.

Apache Commons Configuration fonctionne très bien. Il prend en charge le stockage de la configuration dans un large éventail de formats sur le serveur, notamment les propriétés, XML, JNDI, etc. Il est facile à utiliser et à étendre. Pour obtenir le maximum de flexibilité, utilisez une fabrique pour obtenir la configuration et utilisez l’ interface de configuration par la suite.

Deux caractéristiques de Commons Configuration qui le différencient par rapport à un fichier de propriétés direct sont qu’elles prennent en charge la conversion automatique en types communs (int, float, tableaux) et qu’elles prennent en charge la substitution de propriété:

server.host=myHost server.url=http://${server.host}/somePath 

Voici différentes options:

  • java.util.Propriétés
  • java.util.prefs.Preferences (depuis Java 5)
  • Configuration des communes
  • jConfig
  • JFig
  • Service de configuration de Carbon

Vous voudrez peut-être lire Comparaison de la configuration des communes avec JFig et JConfig et Configurer vos applications en utilisant JFig pour obtenir des commentaires de divers utilisateurs.

Personnellement, j’ai utilisé jConfig et ce fut une bonne expérience.

Configuration des communes

Nous utilisons ceci. Les fichiers de propriétés seuls sont beaucoup plus faciles à manipuler, mais si vous avez besoin de représenter des données plus complexes, la configuration des commons peut le faire et lire également vos fichiers de propriétés.

Si vous ne faites rien de compliqué, je m’en tiendrai aux fichiers de propriétés.

Si vous voulez faire quelque chose de avancé (et de type), vous pouvez jeter un oeil à ceci: http://www.ibm.com/developerworks/java/library/j-configint/index.html

L’outil Intelligent Parameter Utilization Tool (InPUT, page ) permet d’ extérioriser presque n’importe quelle décision (codée en dur) en tant que paramètre dans un fichier de configuration XML. Il a été lancé au début de 2012 en réponse aux lacunes perçues dans les outils de configuration existants en ce qui concerne la généralité et la séparation des préoccupations.

InPUT est probablement plus puissant que la plupart des cas d’utilisation, car il permet une formulation indépendante du langage de programmation de données expérimentales (entrées-sorties), avec des fonctionnalités telles que la définition de descripteurs complexes pour les mappages de classes ou la création et la validation de configurations aléatoires. plages de valeurs prédéfinies (pour les tests et la recherche, par exemple les simulations Monte Carlo). Vous pouvez définir des parameters avec des sous-parameters, des ressortingctions relatives aux valeurs des parameters (parameters numériques a> param b), etc.

C’est toujours en version bêta, mais plutôt stable, je l’utilise pour mes recherches, pour la configuration et la documentation des expériences et à des fins pédagogiques . Une fois qu’il est disponible pour d’autres langages (adaptateur C ++ dans le canal), d’autres chercheurs / praticiens peuvent réutiliser les descripteurs exécutant leurs implémentations des mêmes algorithmes en C ++ (en utilisant le concept de mappage de code). De cette manière, les résultats expérimentaux peuvent être validés / les programmes peuvent être migrés plus facilement . La documentation est toujours en cours de traitement, mais quelques exemples sont disponibles sur la page. InPUT est un logiciel open source .

Pour les personnes intéressées, le document de recherche conceptuel .

J’ai tendance à utiliser java.util.Properties (ou des classes similaires dans d’autres langages et frameworks) la plupart du temps dans une classe de configuration spécifique à l’application , mais je suis très intéressé par les alternatives ou les variantes. Surtout que les choses peuvent devenir un peu délicates si des boîtes de dialog de configuration graphique ou des vues multiples sur les données de configuration sont impliquées.

Malheureusement, je n’ai aucune expérience avec des bibliothèques spécifiques pour Java (sauf avec celles que j’ai écrites moi-même), mais tout pointeur serait apprécié.

Mettre à jour

D’ACCORD. Ce n’était pas tout à fait vrai, le troisième est le projet de configuration Java de Spring .

J’ai écrit à ce sujet il y a quelques semaines et je suis arrivé à la conclusion que XML est l’une des notations les plus utilisées.

Est-ce le meilleur? Je ne pense pas, j’aime vraiment JSON, mais les outils ne sont pas encore au format XML, donc je suppose que nous devons attendre et voir.

Vous pouvez essayer YamlBeans . De cette façon, vous écrivez les classes que vous souhaitez conserver avec vos données de configuration, puis vous pouvez les écrire et les lire automatiquement depuis et vers YAML.

YAML est un format de données lisible par l’homme. Il a un pouvoir plus expressif que java.util.Properties. Vous pouvez avoir des listes, des cartes, des ancres, des données saisies, etc.

S’il vous plaît jeter un oeil à cette URL: http://issues.apache.org/jira/browse/CONFIGURATION-394

La structure de configuration que nous recherchons est en partie supérieure à la configuration d’Apache Commons et doit prendre en charge les problèmes de concurrence, les problèmes JMX et la plupart des magasins (par exemple, fichier .properties, fichiers .xml ou PreferencesAPI).

Ce que l’équipe weblogic fournit sur «Administration Console» est intéressant car elle vous permet d’avoir des mises à jour transactionnelles (atomiques) sur les configurations afin que les écouteurs enregistrés soient avertis.

Les gars d’Apache insistent sur le fait que ce projet est hors de scope de Commons Configuration, peut-être!

J’ai attaché un cadre de configuration simple, regardez s’il vous plaît.

Je viens de poster un bref code sur l’utilisation de ClassPathResource de Spring comme alternative à l’IoC. ClassPathResource vous permet de placer des fichiers de propriétés n’importe où sur le chemin de classe (par exemple, tous au même endroit ou en tant que pairs du code qu’ils configurent. Mon exemple utilise simplement java.util.Properties, vous pouvez donc utiliser le style “nom = valeur” en texte brut) ou son format XML.

Les fichiers de propriétés sont très simples, si vous avez besoin de quelque chose de plus fonctionnel, vous pouvez formater certains de vos fichiers de configuration en tant que classes Java. Ceux-ci peuvent être placés dans un package / module différent et peuvent être pré-compilés ou chargés à l’exécution avec une bibliothèque comme BeanShell.

Remarque: Dans le cas le plus simple (pré-compilé), vous n’avez pas besoin de bibliothèques supplémentaires.

Concernant les suggestions d’utilisation de java.util.Properties – à partir de jdk 1.5, l’API Preferences (java.util.prefs) semble être l’alternative préférée à l’utilisation de l’API Properties.

Motifs: évolutivité accrue, neutralité dorsale, etc.

Vous pouvez jeter un coup d’œil aux outils nouvellement annoncés, tools4j-config, dont la mission est de vous permettre de gérer facilement la configuration à l’exécution.