Thread.currentThread().getContextClassLoader().getResourceAsStream() gibt null zurück
Habe ich folgende code-block in meiner Anwendung;
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(FilePath);
Hier 'FilePath' ein absoluter Pfad der Datei.
Obige code funktioniert in linux und in windows, wenn ich die Anwendung ausführen im normalen Modus.(ie: in der Eingabeaufforderung)
Aber das wird NICHT funktionieren, wenn ich die Anwendung ausführen als windows-Dienst. Ich bekomme Eingabe-stream als 'null'.
Jemand begegnet solchen Problem vor? Ich konnte nicht finden alle Informationen über diese anderen als java-classloadern . Hier verwenden wir "ContextClassLoader", das ist der richtige classloader verwendet werden..
Keine Ahnung?
Zeigen Sie uns den genauen Pfad, den Sie verwenden. "absoluten Pfad" klingt falsch in diesem Kontext.
Hier mein Pfad ist wie das repository"+ Datei.separator +"Mittel"+ Datei.separator +"api_templates"+ "api.xml"; (ich habe home-Verzeichnis in meinem wrapper.conf-Datei und meine Anwendung als Dienst gestartet, erfolgreich)."repository-Verzeichnis ist eine erste untergeordneten Verzeichnis aus meinem home-Verzeichnis
Sind Sie sicher, dass die ID, die Ihre app läuft als wenn es ein Dienst erlaubt den Lesezugriff auf die Datei, die Sie versuchen zu öffnen? Wenn es läuft wie Sie Ihre ID in Ordnung, aber nicht als Dienst, dann in meinem Kopf, der einzige Unterschied würde sein, wie es ausgeführt wird, oder von wem es ausgeführt wird.
Wenn Sie eine Klasse verwenden-Frontlader, sollten Sie nur geben Sie einen Pfad, der relativ zu einer Ressource in der Klasse Weg. Wenn Sie möchten, absolute Pfade verwenden, verwenden Sie FileInputStream.
danke für die Hilfe..FileInputstrem funktioniert einwandfrei. Verändert mein code wie InputStream in = new FileInputStream(filePame);
Hier mein Pfad ist wie das repository"+ Datei.separator +"Mittel"+ Datei.separator +"api_templates"+ "api.xml"; (ich habe home-Verzeichnis in meinem wrapper.conf-Datei und meine Anwendung als Dienst gestartet, erfolgreich)."repository-Verzeichnis ist eine erste untergeordneten Verzeichnis aus meinem home-Verzeichnis
Sind Sie sicher, dass die ID, die Ihre app läuft als wenn es ein Dienst erlaubt den Lesezugriff auf die Datei, die Sie versuchen zu öffnen? Wenn es läuft wie Sie Ihre ID in Ordnung, aber nicht als Dienst, dann in meinem Kopf, der einzige Unterschied würde sein, wie es ausgeführt wird, oder von wem es ausgeführt wird.
Wenn Sie eine Klasse verwenden-Frontlader, sollten Sie nur geben Sie einen Pfad, der relativ zu einer Ressource in der Klasse Weg. Wenn Sie möchten, absolute Pfade verwenden, verwenden Sie FileInputStream.
danke für die Hilfe..FileInputstrem funktioniert einwandfrei. Verändert mein code wie InputStream in = new FileInputStream(filePame);
InformationsquelleAutor Ratha | 2014-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dies geschieht, weil Sie haben "." (der aktuelle Ordner) auf dem Klassenpfad. Das ist a) eine schlechte Idee ist und b) macht Ihre app brechen auf seltsame Weise.
Was Sie brauchen, um zu verstehen, ist der Unterschied zwischen einer Datei und einer resource. Eine Datei ist etwas außerhalb des classpath.
Sollten Sie verwenden
File
undFileReader
Zugang zu Ihnen.Eine Ressource ist etwas, das im classpath. Pfade für Ressourcen verwenden Sie immer
/
als file-separator und nichtFile.separator
.Einen anderen Weg um dies zu beheben, fügen Sie
$HOME/repository/
(Linux) oder%HOME%/repository/
im classpath und laden Sie die Ressource mit"resources/api_templates/api.xml"
. für diese Arbeitresources
muss ein Ordner in$HOME/repository/
.Wenn Sie dies nicht tun, dann werden alle Dateien in Ihrem home-Verzeichnis (oder was auch immer-Verzeichnis, das Sie geschehen, um die Anwendung zu starten) Hinzugefügt werden, werden Ressourcen, die im Klassenpfad.
InformationsquelleAutor Aaron Digulla