Ant: Как выполнить Ant из Java

#java #ant

#java #ant

Вопрос:

Я пытаюсь выполнить цель Ant из Java для поиска каталогов по критериям. Если запустить searchDirectories из консоли, результат в порядке, если из класса Java, каталоги не найдены.

 File buildFile = new File("build.xml");

Project p = new Project();
p.setUserProperty("ant.file", buildFile.getAbsolutePath());
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
p.addReference("ant.projectHelper", helper);
helper.parse(p, buildFile);

try {
    p.fireBuildStarted();
    p.fireSubBuildStarted();
    p.executeTarget("searchDirectories");
} catch (IOException e) {
    p.fireBuildFinished(e);
}
  

РЕДАКТИРОВАТЬ: Если я вызываю Ant из каталога, в котором содержится build.xml будут найдены каталоги. В противном случае, когда ant выполняется через эту строку, результат неверен.

 ant -buildfile D:Projectsantproj searchDirectories
  

Я не могу понять, в чем проблема?

Комментарии:

1. Как насчет Runtime#exec(String) ? Вы можете выполнить ту же команду, которую используете в своей командной строке.

2. битнгу13, это все равно не работает

Ответ №1:

Вы можете запустить Ant из Java и распечатать выходные данные в System.out следующим образом (обратите внимание, что -buildfile это то же самое, что -file или -f ):

 ProcessBuilder builder = new ProcessBuilder("ant", "-f", "/path/to/build.xml", "searchDirectories");
Process process = builder.start();

try (BufferedReader out = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
    out.lines().collect(Collectors.toList()).forEach(System.out::println);
}
  

Если ваша searchDirectories задача выдает неправильные результаты, возможно, соответствующая <target> содержит ошибку.