Проблема с построителем процессов - PullRequest
0 голосов
/ 21 января 2010

Я работаю над Java-программой, в которой мне нужно вызывать другую Java-программу, используя построитель процессов, потому что она использует отдельную JRE.

Вот пакетная программа, которая вызывает эту программу и работает правильно:

cd C:\apps\Project_name\bin\
C:\Progra~1\Java\jre1.6.0_03\bin\java -Xms512m -Xmx1024m
     -cp ../lib/spring-1.2.2.jar;../lib/log4j-1.2.8.jar;../lib/commons-logging-1.0.4.jar;../lib/wrapper.jar
     com.project.main.MainProgramLauncher arg1 arg2

Теперь я объявил свой код примерно так:

ProcessBuilder builder = new ProcessBuilder(
    "java",
    "-Xms512m",
    "-Xmx1024m",
    "-cp ../lib/spring-1.2.2.jar;../lib/log4j-1.2.8.jar;"+
    "../lib/commons-logging-1.0.4.jar;../lib/wrapper.jar",
    "com.project.main.MainProgramLauncher arg1 arg2 ...argN"
);
Map<String, String> environment = builder.environment();

environment.put("path", ";"); // Clearing the path variable;
environment.put("path", java_bin_location+";");
Process javap = builder.start();
InputStreamReader tempReader = new InputStreamReader(
    new BufferedInputStream(javap.getInputStream())
);
BufferedReader reader = new BufferedReader(tempReader);
while (true) {
    String line = reader.readLine();
    if (line == null)
        break;
    System.out.println(line);
}

Но это не так, как должно быть. Программа вылетает сразу. Есть что-то другое, что я должен делать? Пожалуйста, предложите.

1 Ответ

1 голос
/ 21 января 2010

Я предполагаю, что вы должны указывать имя класса и параметры в разных строках. вместо:

"java",
"-Xms512m",
"-Xmx1024m",
"-cp ../lib/spring-1.2.2.jar;../lib/log4j-1.2.8.jar;"+
"../lib/commons-logging-1.0.4.jar;../lib/wrapper.jar",
"com.project.main.MainProgramLauncher arg1 arg2 ...argN"

должно быть

"java",
"-Xms512m",
"-Xmx1024m",
"-cp",
"../lib/spring-1.2.2.jar;../lib/log4j-1.2.8.jar;"+
"../lib/commons-logging-1.0.4.jar;../lib/wrapper.jar",
"com.project.main.MainProgramLauncher",
"arg1",
"arg2",
...
"argN"

Еще одна заметная вещь, что вы использовали полный путь для вызова java.exe, но не когда вы использовали ProcessBuilder.

Вы также можете прочитать поток ошибок (или вызвать redirectErrorStream(true) - аргумент важен (!)).

...