2015-04-16 14 views
1

В приложении Java я хочу выполнить файл jar с несколькими параметрами. Для этого я создаю список строк со всеми элементами команды, и я передаю его методу Runtime.exec() (это очень просто).classpath с пробелами для запуска процесса Java с помощью Runtime.getRuntime(). Exec() в Windows

Вот код с твердыми закодированными строками (Реальное использование кода переменных конечно):

List<String> cmd = new ArrayList<String>(); 
cmd.add("java"); 
cmd.add("-Dpython.path=\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\jython.jar\";\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\Lib\""); 
cmd.add("-cp"); 
cmd.add("\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\..\\build\\jython-engine.jar\";\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\jython.jar\";\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\bin\\..\\plugins\\*\";\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\bin\\..\\kernel\\target\\qtaste-kernel-deploy.jar\";testapi\\target\\qtaste-testapi-deploy.jar"); 
cmd.add("org.python.util.jython"); 
cmd.add("Testbeds\\ControlScripts\\playback.py"); 
cmd.add("start"); 

int exitCode = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]), env, output); 

В Windows 8, когда я делаю что внутри приложения JAVA, я получаю сообщение об ошибке: «Не удалось найти или загрузить основной класс с помощью ". Если я выполняю непосредственно команду в консоли, она работает. Я думаю, что эта ошибка связана с пробелами в некоторых путях, но я не понимаю, как делать больше, чем окружать кавычками все строки с пробелами (как я уже сделал).

Этот код отлично работает в Linux, когда корневой каталог содержит (или не) пробелы. Этот код работает также и в Windows 8, когда корневой каталог не содержит пробелов.

У вас есть идея по устранению этой проблемы?

ответ

0

Try, чтобы избежать пробелов:

List<String> cmd = new ArrayList<String>(); 
cmd.add("java"); 
cmd.add("-Dpython.path=\"C:\\Users\\ange\\Documents\\QTaste\ With\ Spaces\\tools\\jython\\lib\\jython.jar\";\"C:\\Users\\ange\\Documents\\QTaste\ With\ Spaces\\tools\\jython\\lib\\Lib\""); 
cmd.add("-cp"); 
cmd.add("\"C:\\Users\\ange\\Documents\\QTaste\ With\ Spaces\\tools\\jython\\lib\\..\\build\\jython-engine.jar\";\"C:\\Users\\ange\\Documents\\QTaste\ With\ Spaces\\tools\\jython\\lib\\jython.jar\";\"C:\\Users\\ange\\Documents\\QTaste\ With\ Spaces\\bin\\..\\plugins\\*\";\"C:\\Users\\ange\\Documents\\QTaste\ With\ Spaces\\bin\\..\\kernel\\target\\qtaste-kernel-deploy.jar\";testapi\\target\\qtaste-testapi-deploy.jar"); 
cmd.add("org.python.util.jython"); 
cmd.add("Testbeds\\ControlScripts\\playback.py"); 
cmd.add("start"); 

int exitCode = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]), env, output); 

EDIT

Не избежать пробелов, но поставить полного кавычек пути к классам.

Следующей работа Кода для меня, и если я пытаюсь написать неправильный путь к классам программа выводит сообщение об ошибке, данном Java

public static void main(String[] args) throws InterruptedException, IOException { 
    List<String> cmd = new ArrayList<String>(); 
    cmd.add("java"); 
    cmd.add("-Dpython.path=\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\jython.jar\";\"C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\Lib\""); 
    cmd.add("-cp"); 
    cmd.add("\"" 
      + "C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\..\\build\\jython-engine.jar;" 
      + "C:\\Users\\ange\\Documents\\QTaste With Spaces\\tools\\jython\\lib\\jython.jar;" 
      + "C:\\Users\\ange\\Documents\\QTaste With Spaces\\bin\\..\\plugins\\*;" 
      + "C:\\Users\\ange\\Documents\\QTaste With Spaces\\bin\\..\\kernel\\target\\qtaste-kernel-deploy.jar;" 
      + "testapi\\target\\qtaste-testapi-deploy.jar;" 
      + "\""); 
    cmd.add("org.python.util.jython"); 
    cmd.add("Testbeds\\ControlScripts\\playback.py"); 
    cmd.add("start"); 

    System.out.println("START..."); 

    Process p = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()])); 

    final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    new Thread(new Runnable(){ 
     public void run() { 
      String line; 
      try { 
       while ((line = in.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     }; 
    }).start(); 

    final BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    new Thread(new Runnable(){ 
     public void run() { 
      String line; 
      try { 
       while ((line = err.readLine()) != null) { 
        System.err.println(line); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     }; 
    }).start(); 

    int exitStatus = p.waitFor(); 
    System.out.println("exit status: " + exitStatus); 
} 
+0

Я пробовал вашу идею, но она не работает. Я точно понимаю, что я заменил пробелы на «\\», чтобы избежать их (заменить на «\» не компилируется). – remy40

+0

Вы правы, я отредактировал ответ –

0

Я окружила -Dpython.path параметров простой цитаты и она работает. ..

public static void main(String[] args) throws InterruptedException, IOException { 
     List<String> cmd = new ArrayList<String>(); 
//  String qtasteHome = "C:\\Users\\ange\\Documents\\QTaste With Spaces"; //RBA 
//  String qtasteHome = "/home/dev/workspaces/qtaste"; // UBUNTU 
     String qtasteHome = "D:\\Qtaste with spaces"; // Win 8.1 
     cmd.add("java"); 
     cmd.add("-Dpython.path='" + qtasteHome + "\\tools\\jython\\lib\\jython.jar';'" + qtasteHome + "\\tools\\jython\\lib\\Lib'"); 
     cmd.add("-cp"); 
     cmd.add("\"" 
       + qtasteHome + "\\tools\\jython\\lib\\..\\build\\jython-engine.jar;" 
       + qtasteHome + "\\tools\\jython\\lib\\jython.jar;" 
       + qtasteHome + "\\bin\\..\\plugins\\*;" 
       + qtasteHome + "\\bin\\..\\kernel\\target\\qtaste-kernel-deploy.jar;" 
       + "testapi\\target\\qtaste-testapi-deploy.jar;" 
      + "\""); 
     cmd.add("org.python.util.jython"); 
     cmd.add("Testbeds\\ControlScripts\\playback.py"); 
     cmd.add("start"); 

     String command = ""; 
     System.out.println("command parts :"); 
     for (String s : cmd) 
     { 
      System.out.println("\t" + s); 
      command += " " + s; 
     } 

     System.out.println("\nCommand : \n-------\n" + command + "\n-------"); 

     System.out.println("START..."); 

     Process p = Runtime.getRuntime().exec(
       cmd.toArray(new String[cmd.size()])); 

     final BufferedReader in = new BufferedReader(new InputStreamReader(
       p.getInputStream())); 
     new Thread(new Runnable() { 
      public void run() { 
       String line; 
       try { 
        while ((line = in.readLine()) != null) { 
         System.out.println(line); 
        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      }; 
     }).start(); 

     final BufferedReader err = new BufferedReader(new InputStreamReader(
       p.getErrorStream())); 
     new Thread(new Runnable() { 
      public void run() { 
       String line; 
       try { 
        while ((line = err.readLine()) != null) { 
         System.err.println(line); 
        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      }; 
     }).start(); 

     int exitStatus = p.waitFor(); 
     System.out.println("exit status: " + exitStatus); 

 Смежные вопросы

  • Нет связанных вопросов^_^