Программа, использующая waitFor(), не работает на Linux, как на Windows
Привет всем, кто не знает, почему этот код работает на Windows, но не на Linux, поэтому, если кто-то видит что-то не так с этим или другим способом сделать это, я был бы очень признателен за некоторые советы, спасибо за ваше время.
Process p = Runtime.getRuntime().exec(linuxCommand);
int cont=0,retorno=p.waitFor();
try {
synchronized (this) {
while (retorno!=0 && conteo<10000){
retorno=p.waitFor();
System.out.println("cont++);
}
if (retorno == 0) {
ans = true;
logger.info("Return Value: " + ans);
}else{
ans = false;
logger.info("Return Value: " + ans);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
Цель: создать *1_Output.txt* из информации, содержащейся в * 1_Input.txt *,
MyObjectT находится в / var / xp / client / a / h / n / test
MyObjectT вызовет несколько классов в /var/xp/client/a/h/n/clases/z1 и, в конечном итоге, СЧИТАЕТ содержимое 1_Output.txt, чтобы он мог вернуть ans (true / false)
ПРОБЛЕМА
- на окнах: поток при быстром запуске не ждал создания файла 1_Output.txt, поэтому читать было нечего, с текущим кодом, который был решен. (p.waitFor() в итоге возвращает 0 и все довольны)
- Linux: p.waitFor () никогда не возвращает 0, поток заканчивается и ничего
linuxCommand - это разобранная строка, представляющая команду java для выполнения в linux
обратите внимание, что если я вставлю эту команду, как она есть в командной оболочке, она будет работать нормально без предупреждения или ошибки. Я не думаю, что "здесь играют важную роль. LinuxCommand-> /opt/jdk/jdk1.6.0_22/bin/java -classpath" /var/xp/client/a/h/n/clases/z1 ":" / var / xp / client / a / h / n / test "MyObjectT / m: Param21 /f:"/var/xp/client/a/h/n/IOFile/1_Input.txt" / o: "/ var / xp / клиент / а / ч / н /IOFile/1_Output.txt"
так что меня смущает то, что если использовать getErrorStream(), чтобы отследить некоторые ошибки, я получаю это
Exception in thread "main" java.lang.NoClassDefFoundError: MyObjectT
Caused by: java.lang.ClassNotFoundException: MyObjectT
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: MyObjectT. Program will exit.
любая помощь, его высоко ценится еще раз спасибо
Lol Я извиняюсь за имя переменной на испанском языке retorno=return, но во время перевода я не остановился и подумал о возврате ajajjaajajajaj:=)
1 ответ
Есть несколько вещей в игре, одновременно. Во-первых, у вас запущено несколько программ - этой и той, которую вы порождаете - и ошибки в этой программе вызывают проблемы здесь.
Во-первых, linuxCommand
:
/opt/jdk/jdk1.6.0_22/bin/java -classpath
"/var/xp/client/a/h/n/clases/z1":"/var/xp/client/a/h/n/test"
MyObjectT /m:Param21 /f:"/var/xp/client/a/h/n/IOFile/1_Input.txt"
/o:"/var/xp/client/a/h/n/IOFile/1_Output.txt"
Я произвольно обернул это. В зависимости от того, как вы определили эту строку в вашей программе, вам может потребоваться экранировать все "
отметки в этой строке. (Если вы просто распечатаете это, используя System.out.println()
, как это выглядит?)
Вероятно, лучший подход заключается в использовании немного другой формыexec()
тот, который принимает массив строк вместо одной строки. Таким образом, вы можете изменить параметры, как того требует программа, не беспокоясь о правильном цитировании оболочки. Это будет выглядеть примерно так (не проверено):
String linuxCommand[] = {"/opt/jdk/jdk1.6.0_22/bin/java",
"-classpath",
"/var/xp/client/a/h/n/clases/z1:/var/xp/client/a/h/n/test",
"MyObjectT",
"/m:Param21",
"/f:/var/xp/client/a/h/n/IOFile/1_Input.txt",
"/o:/var/xp/client/a/h/n/IOFile/1_Output.txt"};
Process p = Runtime.getRuntime().exec(linuxCommand);
Вы сказали, что запускаете эту команду вручную в оболочке, чтобы подтвердить, что она работает, но те /i
, /o
и т. д. чувствуют себя очень неловко на Unix-подобной платформе. Вы уверены, что формат работает так, как ожидалось в Linux?