Server-Festplatten-Zugriff bei Tomcat-Webprojekt

Kamikatze

Captain
Dabei seit
Okt. 2004
Beiträge
3.703
Hallo.

Nach meinem Thread von damals werden wir unser Web-Projekt nun wirklich erweiterbar machen.

Dazu entwickeln wir eine Hauptplattform, in der sich weitere Module registrieren können. Die Module werden wir als jar-Dateien spezifizieren und diese dann mittels Fileupload in die Plattform einbinden.

Nun zu meinem Problem bzw. zu meiner Frage:
Ist es möglich von einem Tomcat-Webprojekt aus auf die Festplatte des Servers zugreifen zu können? Bzw. direkt in den Tomcat-Homeordner, in dem sich das Projekt befindet?

Die jar-Datei muss dann nämlich entpackt werden, und die Webseiten bzw. class-Dateien müssen zum bestehenden Projekt hinzugefügt werden.

Allerdings bezweifle ich, ob das ganze so einfach funktioniert.

Vielen Dank schon mal für jede Antwort.
 
Zuletzt bearbeitet:

Kamikatze

Captain
Ersteller dieses Themas
Dabei seit
Okt. 2004
Beiträge
3.703
Hey... jetzt steh ich vor einem neuen, großen Problem, das ich überhaupt nicht nachvollziehen kann:

Und zwar kann ich problemlos ins Projektverzeichnis schreiben, wenn ich den Tomcat von Netbeans aus starte (Runtime -> Servers -> Tomcat 5.5 -> Start bzw. Start in Debug Mode).

Doch sobald ich den Tomcat über den Tray Monitor starte, funktionieren die Dateizugriffe nicht mehr. :(

PHP:
private static void getAllFilesEndingWithRecursive(File dir, String suffix, Vector<String> vec) {
// dir --> "C:\Programme\Apache Software Foundation\Tomcat 5.5\webapps\AECP"
// Start aus Tray: dir.exists() -> false
// Start aus Netbeans: dir.exists() -> true
// [...]
}
Weiß jemand weiter? :heul:
 

Cobinja

Lt. Junior Grade
Dabei seit
Juli 2006
Beiträge
454
Wo kommt das dir denn her? Vielleicht wird beim Erstellen des Objektes ein relativer Pfad verwendet oder ein VM-Argument, welches nur in der IDE existiert.
 

Kamikatze

Captain
Ersteller dieses Themas
Dabei seit
Okt. 2004
Beiträge
3.703
Nein der Pfad ist ganz sicher richtig. Eher, dass der Tomcat mit anderen Parametern gestartet wird.

Ich rufe zuerst die nicht rekursive Methode auf. Der Pfad ist immer derselbe, egal wie der Tomcat gestartet wird.

Hier die Methoden, ich hab im Moment noch einige Logs eingebaut:

PHP:
public static Vector<String> getAllFilesEndingWith(String path, String suffix) {
        log.info("Beginn getAllFilesEndingWith(\"path = " + path + "\", \"suffix = " + suffix + "\")");
        
        Vector<String> ret = new Vector<String>();
        File dir = new File(path);
        
        log.info("File dir = new File(path); --> dir = " + dir);
        
        log.info("Vor getAllFilesEndingWithRecursive(...)");
        getAllFilesEndingWithRecursive(dir, suffix, ret);
        log.info("Nach getAllFilesEndingWithRecursive(...)");
        
        return ret;
    }
    
    private static void getAllFilesEndingWithRecursive(File dir, String suffix, Vector<String> vec) {
        log.info("Beginn getAllFilesEndingWithRecursive(\"dir = " + dir + "\", \"suffix = " + suffix + "\")");
        log.info("dir.exists() --> " + dir.exists());
        
        if ((dir != null) && dir.exists()) {
            for (File file : dir.listFiles()) {
                if (file.isDirectory()) {
                    getAllFilesEndingWithRecursive(file, suffix, vec);
                } else {
                    if (file.getName().endsWith(suffix)) {
                        vec.add(file.getPath());
                    }
                }
            }
        }
    }
Code:
12:17:07,944  INFO Backbone:235 - Bevor AecpTools.getAllFilesEndingWith("C:\Programme\Apache Software Foundation/webapps/AECP/", "BackboneHibernate.cfg.xml");
12:17:07,944  INFO BackboneInitSessionFactory:128 - Beginn getAllFilesEndingWith("path = C:\Programme\Apache Software Foundation/webapps/AECP/", "suffix = BackboneHibernate.cfg.xml")
12:17:07,944  INFO BackboneInitSessionFactory:133 - File dir = new File(path); --> dir = C:\Programme\Apache Software Foundation\webapps\AECP
12:17:07,944  INFO BackboneInitSessionFactory:135 - Vor getAllFilesEndingWithRecursive(...)
12:17:07,944  INFO BackboneInitSessionFactory:143 - Beginn getAllFilesEndingWithRecursive("dir = C:\Programme\Apache Software Foundation\webapps\AECP", "suffix = BackboneHibernate.cfg.xml")
12:17:07,944  INFO BackboneInitSessionFactory:144 - dir.exists() --> false
12:17:07,944  INFO BackboneInitSessionFactory:137 - Nach getAllFilesEndingWithRecursive(...)
12:17:07,944  INFO Backbone:238 - Nach AecpTools.getAllFilesEndingWith("C:\Programme\Apache Software Foundation/webapps/AECP/", "BackboneHibernate.cfg.xml");
Gefunden: 0
 
Zuletzt bearbeitet:

Cobinja

Lt. Junior Grade
Dabei seit
Juli 2006
Beiträge
454
Eventuell kann der "Standalone"-Tomcat nicht damit umgehen, wenn in seinem Pfad Leerzeichen drin sind.

Probier mal, die cfg.xml zusätzlich in ein anderes Verzeichnis ohne Leerzeichen zu legen und guck dann mal ob er sie dort findet.
 

Kamikatze

Captain
Ersteller dieses Themas
Dabei seit
Okt. 2004
Beiträge
3.703
Naja, der Tomcat ist ja derselbe. Ich verwende auch aus Netbeans heraus den Standalone, halt nur mit dem Unterschied, dass ich ihn von Netbeans aus starte. Den Bundled verwende ich nicht. Ich werde es aber heute später noch (in der Schule) trotzdem einmal versuchen, danke.

EDIT:
Fehler gefunden. :freak:

Der Pfad ist wirklich falsch - er existiert wirklich nicht (zwischen dem Apache-Verzeichnis und dem webapps-Verzeichnis fehlt noch "Tomcat 5.5"). :rolleyes:

Meine Implementierung zur Ermittlung des Projektpfades scheint nicht ganz fehlerfrei zu sein. Hier werden je nach Tomcat-Start unterschiedliche Werte zurückgegeben.

Wahrscheinlich wird einmal CATALINA_HOME ausgelesen - wahrscheinlich nur wenn Netbeans gestartet ist, denn die Variable ist gar nicht gesetzt - und beim direkten Tomcat-Start kommt meine eigene Methode zum Tragen - und die ist wahrscheinlich nicht ganz fehlerfrei:

PHP:
    /* Pfad des Webprojekts finden:
     * Neue Dateien ohne Pfadangabe werden standardmaessig unter /bin im Tomcat-Verzeichnis angelegt,
     * mit dem getAbsolutePath() erhaelt man den absoluten Pfad der Datei, mit getParent() den
     * Pfad des bin-Ordners und mit dem zweiten getParent() schliesslich den Tomcat-Pfad
     * der uebrige Pfad ist bekannt
     */
    public static String getWebProjectPath() throws Exception {
        String ret = null;
        
        // Query environment variable
        ret = System.getenv("CATALINA_HOME");
        
        // Query of environment variable was not successful
        if (ret == null) {
            if (new File("dummy").exists()) {
                new File("dummy").delete();
            }
            
            FileOutputStream fos = new FileOutputStream("dummy");
            fos.close();
            
        /* entspricht:
            String s1 = new File("dummy").getAbsolutePath();
            String s2 = new File(s1).getParent();
            String s3 = new File(s2).getParent();
            String ret = s3 + "/webapps/AECP/";
         */
            ret = new File(new File(new File("dummy").getAbsolutePath()).getParent()).getParent();
        }
        
        if (ret != null) {
            ret = ret + "/webapps/AECP/";
        }
        
        return ret;
    }

Okay... beim Start ohne Netbeans werden neue Dateien nämlich nicht im Bin-Verzeichnis, sondern direkt im Tomcat-Verzeichnis angelegt. Damit stimmt dann der ermittelte Projektpfad nicht mehr. Ich werde wohl den User dazu auffordern die Systemvariable zu setzen, falls dies nicht getan ist.
 
Zuletzt bearbeitet:
Top