Можно ли вызывать скрипты Ant или NSIS из кода Java?
Можно ли программно вызывать скрипты Ant или NSIS из кода Java во время выполнения? Если так, то как?
4 ответа
Вы можете вызывать ant-скрипты из кода Java.
Смотрите эту статью (прокрутите вниз до раздела "Запуск Ant через 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());
Обновить
Я попытался с помощью следующего файла ant, он ничего не "говорил" (без вывода на консоль), но это сработало: файл действительно был перемещен
<project name="testproject" default="test" basedir=".">
<target name="test">
<move file="test.txt" tofile="test2.txt" />
</target>
</project>
И когда я попробую еще раз (когда нет test.txt
переместить (он уже переехал), я получил java.io.FileNotFoundException
,
Я думаю, что это то, что вы ожидаете, когда вы запускаете что-то из Java.
Если вы хотите выводить консольные задачи ant, вы можете добавить Logger в качестве слушателя сборки.
Из ответа @Perception ниже.
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
Слишком подробно остановитесь на ответе Ниваса - его решение верное, вы не видите результатов своей программы, потому что вы не прикрепили никаких регистраторов к вашему проекту.
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
Это просто базовая настройка, с Ant API Java вы можете сделать гораздо больше.
Да, и Нивас дал самый конкретный ответ и, вероятно, лучший ответ, но назовите меня старомодным, я все же предпочитаю просто делать:
Process child = Runtime.getRuntime().exec(command);
где команда - это строка с вашими командами ant или сценарий оболочки для ваших команд ant;
Если вам не нужны все "навороты", которые, как я признаю, довольно крутые, тогда меньше кода, которым нужно управлять позже. Вы не можете пошагово отлаживать муравьиные звонки, мой путь. Компромисс заключается в том, что ваши файлы должны находиться в специальных местах со специальными именами, но в любом случае Java уже немного невнятен в этом отношении. (Не сердитесь на меня.;) Ява тоже мой любимый язык, но давайте, мы поговорим здесь о вариантах развертывания, и вы знаете, что это небольшая OCD в области параметров развертывания, верно?) Я думаю, все, что я на самом деле Предполагается, что "может быть слишком убить, чтобы использовать нож коммандос, чтобы смазать тост". и учитывать это также.;)
* отредактировано для проповеди
Решение user804965 - это то, которое я реализовал ранее. Мне нужно было запустить несколько команд терминала из Java и использовать объекты Process и Runtime Java. Та же идея может быть применена к выполнению команд ant.
Например:
ProcessBuilder pb = new ProcessBuilder("path/to/my/script/script.sh");
Map<String, String> env = pb.environment();
Process p = pb.start();
p.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line = "";
while ((line = buf.readLine()) != null) {
System.out.println(line);
}
Это запустит файл сценария из Java и выведет вывод на консоль. Внутри script.sh вы можете сделать что-то вроде...
cd /path/to/my/build.xml/file/; ant -p
Или вызовите любой сценарий ant, который вам нужен (например, ant clean).
Вы также можете сделать это, не имея дополнительного файла sh, и просто вызвать команду терминала из Java. Я не пробовал этот подход, хотя.