Um eine Properties-File in Java zu laden gibt es verschiedene Moeglichkeiten. Gehen wir davon aus das in dem Package “de.firma.projekt.resource” die Datei “my.properties” liegt. Dann kann die Properties geladen werden, indem die folgenden Methode mit dem Uebergabeparameter “de/firma/projekt/resource/my.properties” aufgerufen wird.
public Properties loadProp(String name){ URL url = ClassLoader.getSystemClassLoader().getSystemResource(name); Properties prop = new Properties(); try { prop.load(url.openStream()); } catch (Exception e) { e.printStackTrace(); } return prop; }
Die Methode funktioniert wunderbar. Zumindest in einer Stand-Alone-Applikation. Wenn die Methode mit dem gleichen Uebergabeparameter in einem Servlet-Container aufgerufen wird, liefert sie eine leere Properties-File zurueck weil die url “null” ist. In einem Servlet-Container muesste folgender Parameter uebergeben werden, damit es funktioniert: “/WEB-INF/classes/de/firma/projekt/resource/my.properties”.
Die Methode funktioniert also nicht in jedem Context. Das habe ich Heute schmerzvoll gelernt. Als ich meine JUnit-Tests habe laufen lassen, hat alles wunderbar funktioniert. Ein paar Minuten spaeter funktionierte der gleiche Code auf einem Servlet-Container auf einmal nicht mehr.
Hier ist meiner verbesserte Methode die in jedem Context funktioniert.
private Properties loadProperties(final String name){ Properties result = null; try { ClassLoader loader = Thread.currentThread ().getContextClassLoader (); if (loader == null) loader = ClassLoader.getSystemClassLoader(); InputStream in = loader.getResourceAsStream (name); if (in != null){ result = new Properties (); result.load (in); // can throw IOException } } catch (IOException ioe) { log.error("I/O ERROR in loadProperties ", ioe); } catch (Exception e) { log.error("Exception ERROR in loadProperties ", e); } if (result == null){ log.info("could not load Properties from: " + name); } else { log.info("load Properties from: " + name); } return result; }