Выполнение одной Java-программы из другой с помощью Runtime.exec()

Программа тестирования, которую я хотел выполнить, принимает единственный аргумент — имя файла — и создает копию файла со строкой «Это модифицированная версия». вверху нового файла. Когда я тестировал эту программу в одиночку, она работает и создает новый файл.

Затем я написал программу для вызова файла:

public static void main(String[] args) {
    try {
        Process p = Runtime.getRuntime.exec("java Tester.java inputfilename.txt");
        p.waitFor();
        System.out.println("Done");
    } catch(Exception e) {
        System.out.println("Error");
        System.exit(0);
    }
} 

Вышеприведенная программа распечатала «Готово», но она никогда не делала модифицированную версию файла, который я передал. Затем я добавил несколько println() в другую программу. Когда я запускал эту программу в одиночку, она распечатывала эти утверждения, но когда я пытался вызвать ее из программы выше, этого не произошло. Как я могу это исправить?


person user3025403    schedule 23.03.2014    source источник
comment
Яри ​​рассказал вам, почему это вообще не сработало. Но что касается вывода: вам явно нужно прочитать вывод, созданный программой, которую вы там запускаете. Также посмотрите stackoverflow.com/a/21904185.   -  person Marco13    schedule 23.03.2014


Ответы (2)


Вы должны сначала скомпилировать файл .java, а затем запустить его:

Компиляция (класс, содержащий основной метод):

javac Tester.java

Запуск:

java Tester inputfilename.txt
person vikingmaster    schedule 23.03.2014
comment
Я добавил (перед строкой: Process p = Runtime.getRuntime.exec(java Tester.java inputfilename.txt);) строку: Runtime.getRuntime().exec(javac Tester.java); а затем запустил программу. Это все еще не сработало. Мой синтаксис неверен? - person user3025403; 23.03.2014
comment
Откройте cmd, запустите этот материал вручную и сообщите мне, какие ошибки вы получаете. - person vikingmaster; 23.03.2014
comment
Сообщение, которое я получил: Исключение в потоке main java.lang.NoClassDefFoundError: Tester/java Вызвано: java.lang.ClassNotFoundException: Tester.java в java.net.URLClassLoader$1.run(URLClassLoader.java:202) в java.security .AccessController.doPrivileged(собственный метод) в java.net.URLClassLoader.findClass(URLClassLoader.java:190) в java.lang.ClassLoader.loadClass(ClassLoader.java:306) в sun.misc.Launcher$AppClassLoader.loadClass(Launcher .java:301) в java.lang.ClassLoader.loadClass(ClassLoader.java:247) - person user3025403; 23.03.2014
comment
Ну, это другой вопрос, проверьте это stackoverflow.com/questions/6334148/ или просто погуглите. - person vikingmaster; 23.03.2014
comment
.NoClassDefFoundError: Tester/java указывает, что вы все еще добавляете расширение .java при использовании команды java! Яри ​​посоветовал вам примерно за час до этого удалить его! - person Andrew Thompson; 24.03.2014
comment
Спасибо, Эндрю. Я понял это вчера и запустил программу без проблем. - person user3025403; 27.03.2014

"java Tester.java inputfilename.txt"

Должно быть:

"java Tester inputfilename.txt"

Но сделайте себе одолжение и прочитайте (и выполните) все рекомендации Когда Runtime.exec() не работает.

Это может решить другие проблемы. Если нет, он должен предоставить дополнительную информацию о причине сбоя.

Затем не обращайте внимания на то, что он ссылается на exec, и создайте Process, используя ProcessBuilder. Также разбейте String arg на String[] args для учета аргументов, которые сами содержат пробелы.

person Andrew Thompson    schedule 24.03.2014