Программное извлечение определенных задач из файла сборки ant

У меня есть файл build.xml, который импортирует другие xml-файлы ant. Я хотел бы получить от него все задачи javac, чтобы я мог видеть, какой путь к классам установлен для этих задач (javac используется для нескольких целей). Я придумал следующий код (немного упрощённый):

public static void main(String[] args) throws Exception {                                                                                                                                                        
    Project project = new Project();                                                                                                                                                                             
    project.init();                                                                                                                                                                                              
    String build = "build.xml";                                                                                                                                                                                  
    File buildFile = new File(build);                                                                                                                                                                            
    ProjectHelper.configureProject(project, buildFile);                                                                                                                                                          

    Hashtable<String,Object>ht = project.getTargets();                                                                                                                                                           
    for (String key : ht.keySet()) {                                                                                                                                                                             
        try {                                                                                                                                                                                                    
            Target target = (Target)ht.get(key);                                                                                                                                                                 
            Task[] tasks = target.getTasks();                                                                                                                                                                    
            for (Task task : tasks) {                                                                                                                                                                            
                if (task instanceof UnknownElement) {                                                                                                                                                            
                    ((UnknownElement)task).maybeConfigure();                                                                                                                                                     
                    task = ((UnknownElement)task).getTask();                                                                                                                                                     
                    if (task == null) {                                                                                                                                                                          
                        return;                                                                                                                                                                                  
                    }                                                                                                                                                                                            
                }                                                                                                                                                                                                
                if (task instanceof Javac) {                                                                                                                                                                     
                    // here we go                                                                                                                                                                                
                }                                                                                                                                                                                                
            }                                                                                                                                                                                                    
        } catch(Exception ignore) {}                                                                                                                                                                             
    }                                                                                                                                                                                                            
 }

Однако существуют такие задачи, как MacroDef, в которые могут быть вложены другие задачи. Интерфейс TaskContainerуказывает только addTask(task), я не вижу способа получить вложенные задачи.

Как получить все задачи javac? Это нормально иметь решение, в котором библиотека ant не используется, но синтаксический анализ XML кажется громоздким, поскольку ant использует свойства, ссылки, файлы построения, может импортировать другие файлы и т. д.

6
задан ldx 31 March 2012 в 09:20
поделиться