2015-05-19 7 views
1

Следующие работает команда правильно в моем терминале Linux:Как я могу вызвать эту команду с помощью метода Runtime.getRuntime().

java -Djava.library.path=/home/john/native_so_libraries/linux-64 -cp '/home/john/NetBeansProjects/SendReceive/dist/SendReceive.jar:/home/j‌​ohn/Desktop/Dropbox/Libjitsi_linux_64/*' Main "send" 

Эта команда указывает папку для собственных библиотек .so (через Djava.library.path =/...), файл приложения JAR с именем «SendReceive .jar ", папку для JAR-библиотек (через опцию -cp classpath), а также основной класс, содержащий основной метод для запуска, класс под названием« Main ». Он имеет один аргумент командной строки, окруженный кавычками, аргумент «отправить». Эта команда работает и запускает процесс Java с терминала, но я не могу понять, как заставить его работать с Runtime.getRuntime(). Exec из другого процесса.

Обратите внимание, что я прилагаю все усилия, чтобы следовать инструкциям, приведенным в этом уроке: http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2 - это значит, что я использую потоки, чтобы потреблять стандартный поток ввода и стандартный поток ошибок из процесса. Тем не менее, этот процесс не начнется, когда я делаю эту команду терминала в строку вроде так:

Process process = Runtime.getRuntime().exec("java -Djava.library.path=/home/john/native_so_libraries/linux-64 -cp '/home/john/NetBeansProjects/SendReceive/dist/SendReceive.jar:/home/j‌​ohn/Desktop/Dropbox/Libjitsi_linux_64/*' Main \"send\""); 

Как сделать запускать эту команду через Runtime.getRuntime() Отв.?

ответ

3

Короткий ответ - нет. Вместо этого используйте ProcessBuilder. Он позволяет разделить каждый параметр командной строки на свой собственный String, и это будет отображаться как отдельный «аргумент» для процесса. Это делает его очень полезным для работы с путями, которые имеют пробелы в них, например ...

ProcessBuilder pb = new ProcessBuilder(
       "java", 
       "-Djava.library.path=/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64", 
       "-cp", 
       "/home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive.jar:/home/j‌​ohnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64", 
       "Main", 
       "\"send\""); 

pb.redirectErrorStream(true); 
try { 
    Process p = pb.start(); 
    try (InputStream is = p.getInputStream()) { 
     int in = -1; 
     while ((in = is.read()) != -1) { 
      System.out.print((char)in); 
     } 
    } 
    int exitCode = p.exitValue(); 

    System.out.println("Process exited with " + exitCode); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

Это также позволяет перенаправить поток ошибок в стандартный вывод, что делает его легче читать.

Вы также должны прочитать стандартный вывод и проверьте значения выхода для лучшего digansotics

+0

Большое вам спасибо. –

1

Первое, что вам нужно сделать, это выполнить glob (представлен * в вашем пути к классам). Вы также можете использовать ProcessBuilder - который используется для создания процессов операционной системы. И, List<String> или команды (ов) и StringBuilder для выполнения шара. Что-то вроде,

public static void main(String[] args) { 
    String home = System.getProperty("user.home"); 
    System.out.println(home); 
    List<String> command = new ArrayList<>(); 
    command.add("java"); 
    command.add("-Djava.library.path=" + home 
      + "/native_so_libraries/linux-64"); 
    StringBuilder cp = new StringBuilder(); 
    cp.append(home + "/NetBeansProjects/SendReceive/dist/SendReceive.jar"); 
    try { 
     File dir = new File(home + "/Desktop/Dropbox/" 
       + "Libjitsi_linux_64/"); 
     for (File f : dir.listFiles()) { 
      if (f.isFile()) { 
       cp.append(":").append(f.getCanonicalPath()); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    command.add("-cp"); 
    command.add(cp); // <-- shouldn't need literal 
        // single quotes. 
    command.add("Main"); 
    command.add("send"); // <-- shouldn't need literal double quotes. 
    ProcessBuilder pb = new ProcessBuilder(command); 
    pb.inheritIO(); 
    try { 
     Process p = pb.start(); 
     System.exit(p.waitFor()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

Не нужно 'command.add (" - cp "+ cp.toString())' быть разделять параметры, иначе он будет представлен процессу как один аргумент, когда он ожидает два ... – MadProgrammer

+0

@MadProgrammer Да , Хороший улов. Благодарю. –

+0

Большое вам спасибо. –