2009-06-01 1 views
1

Ich versuche, von einem Servlet innerhalb der WAR-Datei auf eine Konfigurationsdatei zuzugreifen. Das Problem ist, dass der Standard-Dateipfad der Tomcat-Root selbst ist und die Hardcodierung des Pfades zur Datei auch nicht als eine Option erscheint. Ist es möglich, Informationen über den ServletContext oder irgendwelche Tomcat-Variablen zu erhalten?Wie kann ich auf eine Konfigurationsdatei von einem Servlet zugreifen, das als WAR-Datei bereitgestellt wird und in Tomcat 5.5 ausgeführt wird?

Antwort

1

Wenn Sie legen Sie die Datei in das Verzeichnis ‚Klassen‘ unter Ihrem spezifischen webapps Verzeichnis (./webapps/{servlet}/classes), dann können Sie darauf zugreifen aus dem Innern einer Java-Klasse, indem Sie diese:

Class.getResourceAsStream(<filename>); 

so, wenn Sie an/webapps/myservlet/eine conf Datei haben Klassen/Konf.xml

Class.getResourceAsStream("conf.xml"); 
0

Ich bin überhaupt nicht sicher, dass es das "richtige" zu tun ist, aber in der Vergangenheit habe ich eine Umgebungsvariable für den Pfad zu meiner Konfigurationsdatei gelesen.

So etwas (sollten Sie einen besseren Job machen, die Ausnahmen von der Handhabung als dieses Beispiel macht ... aber Sie erhalten den Punkt):

public File getConfigurationFile() { 
    String envPath = System.getEnv("CONFIG_FILE"); // Use a better-named variable 
    if(envPath == null || envPath.equals("") { 
     throw new RuntimeException("CONFIG_FILE environment variable not set."); 
    } else { 
     File f = new File(envPath); 
     if(!f.exists()) { 
     throw new RuntimeException("CONFIG_FILE environment variable points to non-existent file"); 
     } else if(!f.isFile()) { 
     throw new RuntimeException("CONFIG_FILE environment variable points to non-file entity."); 
     } else if(!if.canRead()) { 
     throw new RuntimeException("CONFIG_FILE points to unreadable file."); 
     } else { 
     return f; 
     } 
    } 
} 
1

Gandalf hat die "richtige" Antwort gegeben. Sie können das sicher überall verwenden. Es ist alles was du brauchst.

Nur eine Warnung. Einige Leute nehmen an, dass, weil es Möglichkeiten gibt, Daten innerhalb einer WAR zu lesen, das heißt, es ist auch OK, Daten innerhalb einer WAR zu schreiben. Im wörtlichen Sinne stimmt das manchmal. Aber nicht immer. Und es ist fast NIE sicher.

Ich erwähne dies, weil ich eine Webapp geerbt habe, die genau das getan hat. Gespeichert einen ganzen Verzeichnisbaum von Dateien in einem explodierten WAR-Verzeichnis. Erste Software-Aktualisierung, die kam, "Poof!" all diese sorgfältig hochgeladenen Dateien waren weg.

Behandeln Sie WARs als schreibgeschützt. Wenn Sie schreiben müssen, geben Sie ein Verzeichnis AUSSERHALB des Anwendungsservers an. Vorzugsweise als konfigurierbarer Parameter in Ihrer web.xml-Datei, so dass Sie JNDI zum Nachschlagen verwenden können und Sie diese für Testzwecke überschreiben können, ohne den Quellcode ändern zu müssen.