Je dois lire un fichier de propriétés qui est enterré dans la structure de mon package dans com.al.common.email.templates
.
J'ai tout essayé et je n'arrive pas à comprendre.
En fin de compte, mon code sera exécuté dans un conteneur de servlets, mais je ne veux pas dépendre du conteneur pour quoi que ce soit. J'écris des cas de test JUnit et il doit fonctionner dans les deux cas.
Lors du chargement des propriétés d’une classe dans le package com.al.common.email.templates
, vous pouvez utiliser
Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();
(Ajoutez toute la gestion des exceptions nécessaire).
Si votre classe ne fait pas partie de ce package, vous devez acquérir le InputStream légèrement différemment:
InputStream in =
getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");
Les chemins relatifs (ceux sans précédant '/') dans getResource()
/getResourceAsStream()
signifient que la ressource sera recherchée par rapport au répertoire qui représente le paquet dans lequel se trouve la classe.
Utiliser Java.lang.String.class.getResource("foo.txt")
permet de rechercher le fichier (inexistant) /Java/lang/String/foo.txt
sur le chemin de classe.
L'utilisation d'un chemin absolu (qui commence par '/') signifie que le package actuel est ignoré.
Pour ajouter à la réponse de Joachim Sauer, si vous avez besoin de le faire dans un contexte statique, vous pouvez procéder de la manière suivante:
static {
Properties prop = new Properties();
InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
prop.load(in);
in.close()
}
(Traitement des exceptions éliminé, comme avant.)
Les deux cas suivants concernent le chargement d'un fichier de propriétés à partir d'un exemple de classe nommé TestLoadProperties
.
Cas 1: Chargement du fichier de propriétés en utilisant ClassLoader
InputStream inputStream = TestLoadProperties.class.getClassLoader()
.getResourceAsStream("A.config");
properties.load(inputStream);
Dans ce cas, le fichier de propriétés doit se trouver dans le répertoire root/src
pour que le chargement soit réussi.
Cas 2: Chargement du fichier de propriétés sans utiliser ClassLoader
InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);
Dans ce cas, le fichier de propriétés doit se trouver dans le même répertoire que le fichier TestLoadProperties.class
pour que le chargement soit réussi.
Remarque:TestLoadProperties.Java
et TestLoadProperties.class
sont deux fichiers différents. Le premier fichier .Java
se trouve généralement dans le répertoire src/
d'un projet, tandis que le second, le fichier .class
, se trouve généralement dans son répertoire bin/
.
public class Test{
static {
loadProperties();
}
static Properties prop;
private static void loadProperties() {
prop = new Properties();
InputStream in = Test.class
.getResourceAsStream("test.properties");
try {
prop.load(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public class ReadPropertyDemo {
public static void main(String[] args) {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(
"com/technicalkeeda/demo/application.properties"));
System.out.println("Domain :- " + properties.getProperty("domain"));
System.out.println("Website Age :- "
+ properties.getProperty("website_age"));
System.out.println("Founder :- " + properties.getProperty("founder"));
// Display all the values in the form of key value
for (String key : properties.stringPropertyNames()) {
String value = properties.getProperty(key);
System.out.println("Key:- " + key + "Value:- " + value);
}
} catch (IOException e) {
System.out.println("Exception Occurred" + e.getMessage());
}
}
}
En supposant que vous utilisiez la classe Propriétés , via sa méthode load , et je suppose que vous utilisez le ClassLoader getResourceAsStream pour obtenir le flux d'entrée.
Comment allez-vous passer dans le nom, il semble qu'il devrait être sous cette forme: /com/al/common/email/templates/foo.properties
Personne ne mentionne une solution similaire mais encore plus simple que ci-dessus sans avoir à traiter le package de la classe. En supposant que myfile.properties se trouve dans le chemin de classe.
Properties properties = new Properties();
InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
properties.load(in);
in.close();
Prendre plaisir
J'ai réussi à résoudre ce problème avec cet appel
Properties props = PropertiesUtil.loadProperties("whatever.properties");
En plus, vous devez mettre votre fichier what.properties dans/src/main/resources