Rambler's Top100 Запускаем Ant из Java кода
  Rambler's Top100
С.Зубарев
Запускаем Ant из Java кода


   Рассмотрим ситуацию, когда необходимо запустить выполнение ant скрипта непосредственно из java кода. Такая задача например возникает когда есть некий daemon, который на некоторое событие должен запустить компиляцию кода без участия человека. В качестве примера ant скрипта возьмем описанный тут.

Код программы следующий:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import org.apache.tools.ant.*;
public class AntIntegration {
	public String run(){
		//файл, содержащий ant скрипт
		File buildFile = new File("build.xml");
		Project p = new Project();
		p.setUserProperty("ant.file", buildFile.getAbsolutePath());
		
		//добавляем консольный вывод процесса
		DefaultLogger consoleLogger = new DefaultLogger();
		ByteArrayOutputStream sw = new ByteArrayOutputStream();
		PrintStream ps = new PrintStream(sw);
		consoleLogger.setErrorPrintStream(ps);
		consoleLogger.setOutputPrintStream(ps);
		consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
		p.addBuildListener(consoleLogger);
		///////////////////////////////
		
	 try {
		p.fireBuildStarted();
		p.init();
		p.setBasedir(".");
		ProjectHelper helper = ProjectHelper.getProjectHelper();
		p.addReference("ant.projectHelper", helper);			
		helper.parse(p, buildFile);			
		
		/**
		запускаем выполнение default task - что 
		эквивалентно выполнению команды 'ant' в консоли
		*/
		p.executeTarget(p.getDefaultTarget());
		/**
		 запускаем выполнение задачи под именем def - что эквивалентно 
		 выполнению команды 'ant def' в консоли
		 */
		p.executeTarget("def");
		
		p.fireBuildFinished(null);
	 } catch (BuildException e) {
	   p.fireBuildFinished(e);
	 }
	 return sw.toString();
		
	}
	public static void main(String[] args) throws Exception{	
		System.out.println((new AntIntegration()).run());		
	}
Нужно также не забыть добавить библиотеку ant в classpath проекта.

Следует отметить, что таким образом можно не ограничиваться только выполнением готового скрипта - можно его модифицировать. Например, добавить новое свойство(property) и его значение указать в зависимости от контекста программы:
  p.setProperty("property_name", "my custom property value");
Все это сделает скрипт более гибким.
Программные продукты

Открытые коды