2012-04-10 3 views
1

ausgeführt wird Ich mache eine Webanwendung, die an einem bestimmten Punkt einen neuen Thread startet, und dieser Thread führt eine JAR-Datei über die Befehlszeile aus. Die Befehlszeile jar funktioniert gut, wenn sie von außerhalb der Anwendung aufgerufen wird, aber wenn ich sie aus dem Thread aufruft, wird der relative Pfad C: \ eclipse \ (ich führe die Anwendung von Eclipse aus) anstelle des Verzeichnisses, in dem sie gespeichert ist vermasselt seine Konfiguration, da es nach Dateien am falschen Ort sucht.Relativer Pfad wird geändert, wenn von einem Thread

Das jar erstellt eine Protokolldatei, wenn ich versuche, es aufzurufen, habe ich diese Zeile in das Protokoll geschrieben: "10/04/2012 17:09:03 - java.io.FileNotFoundException: C: \ eclipse \ descriptors \ analysis_engine \ AggregateAE.xml " Das Jar befindet sich nicht in C: \ eclipse. Wenn ich es von der Eingabeaufforderung aus anrufe, habe ich keine Probleme, aber wenn es von einem neuen erzeugten Thread aufgerufen wird, habe ich diesen Fehler. Ich habe es in einer Produktionsumgebung versucht und ich habe das gleiche Problem (dieses Mal ist der Basispfad der Server)

In Anbetracht, dass ich nicht alle Pfade ändern kann, was könnte eine Lösung für dieses Problem sein?

EDIT: Dies ist der Thread-Klasse, die das Glas diese

public class UimaThread extends Thread { 
private int mode=0; 
private String path; 

public UimaThread(int mode, String path){ 
    this.mode=mode; 
    this.path=path; 
} 

public void run() { 
    Runtime run = Runtime.getRuntime(); 
    try { 
     Properties config = ConfigLoader.getConfig(); 

     String uimaPath=config.getProperty("uimaPath")+ControlPanelUtils.getDelimiter(config.getProperty("uimaPath")); 
//uimaPath is the absolute path to the jar file, mode and path are just arguments passed to the jar 
     run.exec("java -jar "+uimaPath+"uimachainfull.jar "+mode+" "+path); 

    } 

} 

Der Code läuft nennt, ist:

public void startUima() throws IOException, ServletException { 
    Properties config = ConfigLoader.getConfig(); 
    UimaThread uimaThread = new UimaThread(2, config.getProperty("docPath")); 
    uimaThread.start(); 
} 

Ich brauche diese asynchron ausgeführt werden und außerhalb des Servers, ich habe gefragt, wie man das hier in stackoverflow tun kann und Calling an application from a web server asynchronously

+0

Wie rufen Sie diese JAR? Zeigen Sie den Code. Außerdem nehme ich an, dass Sie wissen, dass Java-Web-Apps (JEE-Apps) technisch nicht erlaubt sind, eigene Threads zu spawnen oder auf das Dateisystem zuzugreifen. Einige Container erlauben das, aber ich bin mir ziemlich sicher, dass das gegen die JEE-Spezifikation ist. –

+0

Ich habe den Code veröffentlicht. Ich habe keine Probleme mit Thread-Laichen und Dateisystem. Meine Anwendung muss viel mit dem Zugriff auf das Dateisystem arbeiten. – valepu

Antwort

0

Ich habe entdeckt, wie es geht, anstatt exec (String Befehl) zu verwenden, musste ich exec (Stri ng command, String [] envp, Datei dir) und das letzte Argument (dir) ist das Arbeitsverzeichnis, das als neues Argument übergeben werden kann