Runtime.getRuntime().exec() выполняет две строки?

Мне нужно запустить две строки в Runtime.getRuntime().exec(), эти две:

cd %CMS_HOME%
ant deploy

Теперь можно сделать файл .bat, но я думаю, что это бесполезно для двух строк, должно быть проще! У кого-нибудь есть идеи?


person Danny Gloudemans    schedule 13.03.2012    source источник


Ответы (4)


Поместите его в файл .bat. Это не бесполезно; именно так работает Runtime.exec.

Вам следует изучить возможность использования ProcessBuilder. класс вместо Runtime.exec(). Он был представлен в JDK 5 как преемник Runtime.exec().

person duffymo    schedule 13.03.2012
comment
Я знаю, что .bat — это хороший способ запустить линии. Но мне нужно больше команд из 2 строк. А делать для каждых двух строк .bat файл, было бы грязно. - person Danny Gloudemans; 13.03.2012
comment
Нет, я не согласен. Почему грязный? Сделайте это и двигайтесь дальше. - person duffymo; 13.03.2012
comment
Правильно, просто сделай это и двигайся дальше. Зачем волноваться о том, что не имеет под собой никаких оснований? Твои грязные опасения беспочвенны. - person duffymo; 13.03.2012

Запустите задачу программно из Java:

File buildFile = new File("build.xml");
Project p = new Project();
p.setUserProperty("ant.file", buildFile.getAbsolutePath());
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());
person Boris Pavlović    schedule 13.03.2012

Вы можете использовать Runtime.exec(String command, String[] envp, File dir) для выполнения ant deploy в папке dir.

P.S. Выполнение ant, являющегося Java-программой, с использованием пакетного файла из другой Java-программы немного странно. Вы можете запустить его как класс Java...

person Tarlog    schedule 13.03.2012
comment
Хм, у меня тоже это не работает. Когда я делаю это в cmd, это работает. Но когда я делаю это в Runtime.getRuntime().exec(), он не может найти файл. - person Danny Gloudemans; 13.03.2012

Когда вы запускаете внешнее приложение, вы должны вести себя в соответствии с правилами целевой операционной системы.

В вашем случае вы хотите запустить 2 команды в окнах, поэтому вы должны сказать:

cd TheDir && ant

Попробуйте сначала в командной строке. Затем, чтобы заставить его работать, запустите эту команду с префиксом cmd из java:

cmd /c cd TheDir && ant

В качестве альтернативы вы можете использовать чистое решение Java. Используйте ProcessBuilder вместо Runtime.exec(). ProcessBuilder позволяет вам установить рабочий каталог, чтобы вы могли запускать ant напрямую.

И последний пункт. На самом деле вам вообще не нужно запускать внешний процесс. Ant — это Java-приложение. Вы можете запустить его метод main() прямо из своего приложения и указать все необходимые параметры.

person AlexR    schedule 13.03.2012
comment
Метод De с && работает в CMD, но не работает во время выполнения. Что немного странно, если вы спросите меня .. - person Danny Gloudemans; 13.03.2012
comment
Версия с cmd, вероятно, должна включать кавычки: cmd /c "cd TheDir && ant", иначе более вероятно, что && будет отделять всю часть cmd /c cd TheDir от ant, чем только cd TheDir. EDIT: Только что протестировано, и да, это то, что действительно происходит, поэтому действительно необходимы двойные кавычки. - person Andriy M; 13.03.2012
comment
Но в Java я не могу этого сделать, потому что с кавычками это вне строки! - person Danny Gloudemans; 15.03.2012