Программа, использующая 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?

Другие вопросы по тегам