Hi,
das hab ich gerade probiert:
Code:
logger.debug("bin vor read()-Aufruf!");
int iChar = 0;
while((iChar = bufferedReader.read()) != -1) {
logger.debug("before reading in char....");
commandOutput += iChar;
logger.debug("after reading in char....");
}
Das Resultat ist das gleiche:
Code:
bin vor read()-Aufruf!
und dann hängt das Ganze wieder.......
Was ich jetzt noch alles probiert (das nachstehende mag sinnlos erscheinen, aber wenn man so einen Hänger kriegt und keine Ausgabe probiert man halt jeden noch so bescheuerten Schritt durch):
-> den BufferedReader durch einen InputStreamReader ersetzt:
Code:
InputStreamReader iStreamReader = new InputStreamReader(p.getInputStream());
int iChar = 0;
//bufferedReader.f
while((iChar = iStreamReader.read()) != -1) {
logger.debug("before reading in char....");
commandOutput += iChar;
logger.debug("after reading in char....");
}
Gleiches Ergebnis, sprich keines.
-> statt dem ProcessBuilder Runtime.exec genommen:
Code:
runtime = Runtime.getRuntime();
Process p = runtime.exec("C:\\tmp\\Handle\\handle C:\\tmp\\openSUSE-10.2-GM-i386-CD3.iso");
Gleiches Ergebnis, sprich keines.
-> handle in den pfad aufgenommen
Ergebnis:
Code:
IOException: CreateProcess: error=2
Das soll laut google heissen:
Code:
A value of 2 at that point means "file not found". One of the files in the process is missing.
Tomcat scheint also Umgebungsvariablen zu ignorieren.
Habs dann noch so probiert:
Code:
builder = new ProcessBuilder( "cmd", "/c", pathToFileHandleTool, pathToFile);
und so:
Code:
Process process = runtime.exec( "cmd", "/c","C:\\tmp\\Handle\\handle.exe C:\\tmp\\openSUSE-10.2-GM-i386-CD3.iso");
Also nochmal zusammengefasst:
Rufe ich z.b. nslookup genau wie oben auf:
Code:
ProcessBuilder builder = null;
builder = new ProcessBuilder( "cmd", "/c", "nslookup", "www.google.de");
builder.redirectErrorStream(true);
Process process = null;
String commandOutput = "";
BufferedReader bufferedReader = null;
try {
logger.debug("builder-call: new ProcessBuilder( cmd, /c, pathToFileHandleTool, pathToFile)");
process = builder.start();
logger.debug("called builder.start()");
// read command output
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
logger.debug("before read()-call...");
int iChar = 0;
while((iChar = bufferedReader.read()) != -1) {
logger.debug("before reading in char....");
commandOutput += iChar;
logger.debug("after reading in char....");
}
logger.debug("after read() call....");
logger.debug("command-output: " + commandOutput);
// wait till process has finished
process.waitFor();
} catch (IOException e) {
logger.debug(e.getMessage());
logger.debug(e);
} catch (InterruptedException e) {
logger.debug(e.getMessage());
logger.debug(e);
}
funktioniert!
Rufe ich nun handle direkt auf:
Code:
ProcessBuilder builder = null;
builder = new ProcessBuilder( "cmd", "/c", "C:\\tmp\\Handle\\handle.exe", "C:\\tmp\\foo");
builder.redirectErrorStream(true);
Process process = null;
String commandOutput = "";
BufferedReader bufferedReader = null;
try {
logger.debug("builder-call: new ProcessBuilder( cmd, /c, pathToFileHandleTool, pathToFile)");
logger.debug("test mit handle!!!!!");
process = builder.start();
logger.debug("called builder.start()");
// read command output
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
logger.debug("before read()-call...");
int iChar = 0;
while((iChar = bufferedReader.read()) != -1) {
logger.debug("before reading in char....");
commandOutput += iChar;
logger.debug("after reading in char....");
}
logger.debug("after read() call....");
logger.debug("command-output: " + commandOutput);
// wait till process has finished
process.waitFor();
} catch (IOException e) {
logger.debug(e.getMessage());
logger.debug(e);
} catch (InterruptedException e) {
logger.debug(e.getMessage());
logger.debug(e);
}
hängt!
Hab dann handle in das nslookup-Verzeichnis kopiert und probiert:
Code:
String pathToFileHandleTool = "C:\\WINNT\\system32\\handle.exe";
hängt ebenso..........
Eigentlich würde ich ja davon ausgehen, das es nur über Umwege möglich aus dem Tomcat heraus externe Programme zu starten, ABER:
Mit nslookup klappt es ja auch, und das ist ja auch keine built-in feature sondern ein externes Programm....
Sieht jemand wie das doch noch laufen könnte?
Lesezeichen