2013-06-16 3 views
-1

Я пытаюсь запустить java-файл, используя терминал, но из java. Смысл, я запустил команду с помощью java. Я пытаюсь выполнить команду «cd/Users/apple/Documents/Documents/workspace/UserTesting/src», которая перенаправляется в следующий каталог, а затем выполняет команду «ls», в которой перечислены все файлы в текущем каталогеОшибка при попытке выполнить команду в java

Я использую этот метод, чтобы запустить файл Java '' NewFile.java

try { 
      String line; 
      Process p = Runtime.getRuntime().exec("cd /Users/apple/Documents/Documents/workspace/UserTesting/src"); 
      Process p2 = Runtime.getRuntime().exec("ls"); 

      BufferedReader in = new BufferedReader(
        new InputStreamReader(p2.getInputStream())); 
      while ((line = in.readLine()) != null) { 
      System.out.println(line); 
      } 
      in.close(); 

    } 
    catch (Exception e) { 
      // ... 
     } 

выходной сигнал

Directly using the terminal -> It gives 'NewFile.java'

Using this method using Java -> It always give 'bin' and 'src' for whatever command given to p2

Вот несколько испытаний

Apples-MacBook-Pro:~ apple$ cd /Users/apple/Documents/Documents/workspace/UserTesting/src Apples-MacBook-Pro:src apple$ java NewFile 5 90 35 45 150 3
Reichweite---- nach blase art
3 5 35 45 90 150

Apples-MacBook-Pro:src apple$ java /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile Exception in thread "main" java.lang.NoClassDefFoundError: /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile Caused by: java.lang.ClassNotFoundException: .Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile 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:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Apples-MacBook-Pro:src apple$ java /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile.java Exception in thread "main" java.lang.NoClassDefFoundError: /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile/java Caused by: java.lang.ClassNotFoundException: .Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile.java 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:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Apples-MacBook-Pro:src apple$ Blockquote

+0

Слишком сложно понять вашу проблему. Вам нужно представить его лучше –

+0

Вот гораздо лучшее объяснение @JunedAhsan – student1234

+0

@BrianRoach Это другое, здесь я хочу запустить Java-файл изнутри java, используя команды, которые мы используем в терминале – student1234

ответ

1

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

Вот что происходит: Runtime.geRuntime().exec() создает новый процесс, являющийся дочерним по отношению к родительскому. Каждый процесс имеет свой рабочий каталог; когда вы открываете новый процесс, он наследует рабочий каталог родителя. Вызов cd затем изменит рабочий каталог текущего процесса (и это встроенная оболочка, но на этот раз не обращайте внимания, и я доберусь до него позже).

Так что вы делаете это:

Parent

-> create child 1 -> change working directory of child 1

-> create child 2 -> invoke "ls"

Обратите внимание, что ребенок 2 наследует рабочий каталог родителя. Он ничего не знает о рабочем каталоге дочернего элемента 1. Так что в зависимости от рабочего каталога процесса, вызывающего этот метод (в вашем случае, терминал или ... Я не знаю, ваш JDK установлен?), вы получите разные результаты.

Если вы хотите, одни и те же результаты каждый раз, вы могли бы сделать что-то вроде этого:

Process p = Runtime.getRuntime().exec("ls /Users/apple/Documents/Documents/workspace/UserTesting/src"); 

И если вы хотите, чтобы иметь возможность EXEC программы из любого места, просто используйте полный путь:

Process p = Runtime.getRuntime().exec("java /Users/apple/Documents/Documents/workspace/UserTesting/NewFile"); 

(при условии, конечно, что вы уже использовали javac построить NewFile.class в этом каталоге, и что у вас есть права доступа, чтобы выполнить его.)

Re: cd, как я уже говорил, это команда, встроенная в вашу оболочку. Когда вы вызываете команду, используя exec таким образом, это, скорее всего, не работает. Вы можете проверить это, прочитав стандартную ошибку, используя метод getErrorStream()Process.

+0

Я просто использую ls для тестирования. Я хочу запустить java-файл «NewFile», используя этот метод. – student1234

+0

Полный путь к файлу -/Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile.java – student1234

+0

Вы видели изменение, которое я предложил? Точно так же вы можете передать полный (а не относительный) путь к 'ls', вы также можете передать полный путь к exec. Отредактировал мой ответ, чтобы предоставить код. – danben

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