2010-06-25 8 views
1

Comment puis-je définir dynamiquement certaines propriétés dans Java? Pour l'instant, j'utilise un fichier de propriétés, mais j'ai besoin de modifier ces propriétés avant l'installation, donc ces propriétés doivent être définies dans un fichier en dehors du fichier jar (ou install).Comment: propriétés définies dynamiquement en Java

Ces propriétés définissent ma connexion IBatis.

+1

Veuillez clarifier le problème. Les fichiers de propriétés n'ont pas besoin d'être dans un pot. Pourquoi ne pas simplement le stocker sur le système de fichiers? – erickson

Répondre

2

Continuez avec le fichier .properties et chargez le fichier en tant que ressource.

S'il se trouve dans le chemin de classe, il serait trouvé. Ce que j'utilise, parce que c'est beaucoup plus facile pour moi est un ensemble de ressources à la place.

modifier

Si le fichier est dans votre classpath, vous pouvez chargé soit comme une ressource avec: Some.class.loadResource(...) ou ce que je fais est d'utiliser un ResourceBundle qui fait essentiellement la même chose.

Par exemple, si j'ai:

import java.util.ResourceBundle; 

public class ResourceBundleTest { 
    public static void main(String [] args) { 
     ResourceBundle bundle = ResourceBundle.getBundle("connection"); 
     for(String key: bundle.keySet()){ 
      System.out.printf("bundle[%s]=%s%n",key, bundle.getString(key)); 
     } 
    } 
} 

je peux charger ce fichier si est dans le chemin de la classe. La propriété est à l'extérieur, dans « certains/emboîtée/dir »

$ls -l some/nested/dir/ 
total 8 
-rw-r--r-- 1 oscarreyes staff 35 Jun 25 12:06 connection.properties 
$cat some/nested/dir/connection.properties 
name=Oscar 
lastName=Reyes 
age=0x1F 

Si je cours sans ajouter ce répertoire à mon classpath il ne fonctionnera pas:

$java ResourceBundleTest 
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name connection, locale es_ES 
    at java.ut...ceBundle.java:1427) 
    at java.ut...urceBundle.java:1250) 
    at java.ut...ceBundle.java:705) 
    at Resourc...st.java:6) 

Mais si j'ajoute le répertoire à mon classpath, alors le fichier sera trouvé facilement.

$java -cp some/nested/dir/:. ResourceBundleTest 
bundle[lastName]=Reyes 
bundle[age]=0x1F 
bundle[name]=Oscar 
$ 

De la même façon, vous pouvez avoir un fichier .jar, et de mettre votre fichier .properties où vous voulez, il vous suffit de l'inclure dans votre classpath.

Les propriétés équivalentes en utilisant seraient:

import java.util.Properties; 

public class LoadProperties { 
    public static void main(String [] args) throws java.io.IOException { 
     Properties properties = new Properties(); 
     properties.load(LoadProperties.class.getResourceAsStream("connection.properties")); 
     properties.list(System.out); 
    } 
} 

Mais pour une raison quelconque, je préfère le regroupement de ressources.

+0

Salut, merci pour l'aide, mais je crois que vous ne comprenez pas ma question. Je fais comme vous l'avez dit. Le problème est que les valeurs des propriétés vont changer et que ces valeurs ne peuvent pas être définies dans le fichier jar. Ils doivent être facilement changés. Est-ce clair maintenant? – Victor

+0

Très probablement, vous n'avez pas compris ce que j'ai dit: P S'il est dans le classpath (qui pourrait être en dehors de votre classe), il sera chargé. Permettez-moi de mettre à jour la réponse avec un échantillon – OscarRyz

+0

@Victor: Je crois que vous ne comprenez pas le phénomène "classpath" :) Tout ce que vous devez essentiellement faire est de mettre le fichier dans l'un des chemins couverts par le classpath runtime, ou pour ajouter le chemin du fichier au chemin d'accès à la classe d'exécution. De cette façon, le code Java peut continuer à y accéder en tant que ressource de chemin de classe. – BalusC

0

Un fichier de propriétés est très bien, il vous suffit de l'inclure dans le chemin de classe et il peut vivre en dehors du pot. Si vous voulez avoir plus de colombophilie, vous avez l'API Preferences, mais si cela vous permet de garder les choses au niveau de votre système d'exploitation, cela peut compliquer le déploiement car vous aurez différents emplacements pour votre configuration en fonction de votre plateforme et nécessitera une installation dépendant de la plateforme.

+0

Je ne pense pas que iBatis supporte 'Preferences'. – BalusC

0

Oui, L'utilisation d'un fichier de propriétés est une pratique courante. De plus, la pratique générale est d'avoir un fichier de propriétés séparé pour chaque environnement et le processus de construction choisira le bon en fonction de la cible. Tout ce que vous avez à faire est de conserver le fichier dans classpath et d'utiliser classloader pour le trouver.

1

Placez simplement le fichier dans l'un des chemins couverts par le chemin d'accès aux classes runtime ou ajoutez le chemin du fichier au chemin d'accès à la classe d'exécution (par défaut). De cette façon, le code Java peut continuer à y accéder en tant que ressource de chemin de classe.

Lorsque vous exécutez les fichiers JAR en utilisant la commande java -jar ou par le fichier doubleclicking, les -cp ou -classpath arguments et même la variable d'environnement %CLASSPATH% seront ignorés. Vous pouvez définir le chemin de classe par défaut du fichier JAR en tant qu'entrée Class-Path dans le fichier META-INF/MANIFEST.MF.

E.g.

Class-Path: . 

Le point . signifie que le chemin où le fichier JAR est actuellement assis est inclus dans le classpath d'exécution. Donc, si vous placez le fichier de propriétés dans le même dossier que le fichier JAR, cela fonctionnera.

Vous pouvez également spécifier un chemin de système de fichiers de disque absolu:

Class-Path: /var/foo 

De cette façon, le dossier /var/foo est pris dans le classpath d'exécution. Donc, si vous mettez le fichier de propriétés dans ce dossier, cela fonctionnera.