В разделе комментариев моего поста « Выполнение целевых файлов сборки 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.Projectimport org.apache.tools.ant.ProjectHelperif (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.errconsoleLogger.outputPrintStream = System.outconsoleLogger.messageOutputLevel = Project.MSG_INFOproject.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 за то, что задали интересный вопрос, и Нелл Гавор за четкое объяснение.