Статьи

Прослушивание и запись вывода муравья в Groovy

В разделе комментариев моего поста « Выполнение целевых файлов сборки Ant из Groovy» CRC недавно спросил: «Я использовал ваш сценарий, и он, кажется, работает, но я не смог увидеть вывод на консоли (я вызываю задачу эха» в build.xml), почему? » Это отличный вопрос, и я считаю, что на него лучше ответить в сообщении, чем в комментарии.

В статье developerWorks программным способом запуска Apache Ant Нелл Гавор объясняет, что необходимо сделать, чтобы увидеть вывод, обычно видимый на консоли при обращении к задаче Ant echo в сборке, выполняемой из командной строки: «Когда Ant выполняется из В командной строке вывод автоматически отправляется на консоль. Но [при использовании Project.executeTarget (String) ] вам нужно быть явным. Вам нужно добавить BuildLogger и добавить его в качестве прослушивателя, чтобы он получал уведомления о событиях, происходящих во время сборки ».

BuildLogger, который Gawor упоминает в разделе «Loggers» своей статьи, является частью поддержки Ant для слушателей и регистраторов . В ее статье (и в моем посте) используется DefaultLogger из-за его простоты. DefaultLogger реализует BuildLogger и предоставляет методы setOutputPrintStream (PrintStream) и setErrorPrintStream (PrintStream) . Именно эти два метода «set» позволяют связать стандартный вывод и стандартную ошибку соответственно с экземпляром Ant Project .

В следующем листинге кода показан адаптированный скрипт Groovy, который будет запускать предоставленную цель Ant и печатать выходные данные вызванных целей Ant (например, те, которые используют задачу echo) в стандартный вывод.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env groovy
/**
 * applyBuildFileInGroovy2.groovy
 *
 * This is an example of executing an Ant build file from Groovy code using
 * Ant's Project and ProjectHelper classes. The only difference between this and
 * applyBuildFileInGroovy.groovy is that this version will write to standard
 * output and standard error for invoked Ant targets as appropriate.
 *
 * Usage: applyBuildFileInGroovy.groovy _buildFilePathName_ [target1] [target2] ... [targetn]
 *
 * where _buildFilePathName_ is the path and file name of the build file to be
 * used by this script and zero or more targets in that build file can be
 * specified (default target used if no targets specified).
 */
 
import org.apache.tools.ant.DefaultLogger
import org.apache.tools.ant.Project
import org.apache.tools.ant.ProjectHelper
 
if (args.length < 1)
{
   println "You must provide an Ant build file as the first parameter."
   System.exit(-1)
}
 
def antBuildFilePathAndName = args[0]
def antFile = new File(antBuildFilePathAndName)
def project = new Project()
def consoleLogger = new DefaultLogger()
consoleLogger.errorPrintStream = System.err
consoleLogger.outputPrintStream = System.out
consoleLogger.messageOutputLevel = Project.MSG_INFO
project.addBuildListener(consoleLogger);
project.init()
ProjectHelper.projectHelper.parse(project, antFile)
if (args.length > 1)
{
   def antTargets = args - antBuildFilePathAndName
   antTargets.each
   {
      project.executeTarget(it)
   }
}
else
{
   // use default target because no targets were specified on the command line
   project.executeTarget(project.defaultTarget);
}

В приведенном выше листинге кода строки, которые были добавлены и имеют отношение к этому сообщению, — это строка 17 (импорт DefaultLogger) и строки 31-34 (установка стандартного потока вывода DefaultLogger, стандартного потока ошибок и уровня вывода сообщений). Доступные уровни вывода сообщений определены в классе Project как постоянные целые числа MSG_DEBUG, MSG_ERR, MSG_INFO, MSG_VERBOSE и MSG_WARN. Они описаны в соответствующих комментариях Javadoc этих констант, а также в документации по задаче эха .

Запуск расширенного сценария теперь будет не только выполнять логическое поведение вызванных целей Ant, но также будет направлять вывод этих задач на стандартный вывод и стандартную ошибку. Спасибо CRC за то, что задали интересный вопрос, и Нелл Гавор за четкое объяснение.