2016-10-22 96 views
1

我正在嘗試從Java執行Ant目標,以便按條件搜索目錄。如果從控制檯運行searchDirectories,則結果爲OK,如果來自Java類,則找不到目錄。Ant:如何從Java執行Ant

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:\Projects\antproj searchDirectories 

我不明白是什麼問題?

+0

['Runtime#exec(String)'](https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#exec-java.lang.String- )?您可以執行您在shell中使用的相同命令。 – beatngu13

+0

beatngu13,反正它不起作用 –

回答

1

可以從Java執行Ant和打印輸出到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>包含一個錯誤。