Можно ли вызывать скрипты 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. Я не пробовал этот подход, хотя.

Другие вопросы по тегам