2015-10-14 150 views
0

我想從我的java類運行一個ant腳本runANTScript.xml。該腳本位於我的Web應用程序的SCRIPTS /文件夾中。我試圖運行文件中像這樣從java類執行ant腳本

StringBuffer output = new StringBuffer(); 

    String command="ant -f SCRIPTS/runANTScript.xml" 
    Process p; 
    try { 

     p = Runtime.getRuntime().exec(command); 
     p.waitFor(); 
     BufferedReader reader = 
         new BufferedReader(new InputStreamReader(p.getInputStream())); 

        String line = "";   
     while ((line = reader.readLine())!= null) { 
      output.append(line + "\n"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

但是,這給出了一個錯誤

java.io.IOException: Cannot run program "ant": CreateProcess error=2, The system cannot find the file specified 
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) 
at java.lang.Runtime.exec(Runtime.java:617) 
at java.lang.Runtime.exec(Runtime.java:450) 
at java.lang.Runtime.exec(Runtime.java:347) 
at my.Abc.executeCommand(Abc.java:48) 

我可以使用下面的代碼,但它導入類從的ant.jar跑,我不希望使用jar文件。

import org.apache.tools.ant.BuildException; 
import org.apache.tools.ant.DefaultLogger; 
import org.apache.tools.ant.Project; 
import org.apache.tools.ant.ProjectHelper; 
Project project = new Project(); 
    File buildFile = new File(buildXmlFileFullPath); 
    project.setUserProperty("ant.file", buildFile.getAbsolutePath()); 
    project.addBuildListener(consoleLogger); 

    // Capture event for Ant script build start/stop/failure 
    try { 
     project.fireBuildStarted(); 
     project.init(); 
     ProjectHelper projectHelper = ProjectHelper.getProjectHelper(); 
     project.addReference("ant.projectHelper", projectHelper); 
     projectHelper.parse(project, buildFile); 

     // If no target specified then default target will be executed. 
     String targetToExecute = (target != null && target.trim().length() > 0) ? target.trim() : project.getDefaultTarget(); 
     project.executeTarget(targetToExecute); 
     project.fireBuildFinished(null); 
     success = true; 
    } 

回答

1

你需要

  1. 包括螞蟻可執行文件的路徑,以便Java exec()知道在哪裏可以找到它。

  • 呼叫螞蟻用其絕對路徑
  • 的第一個任務是有點複雜,因爲PATH環境變量在啓動過程中(例如java -Djava.library.path=/path/to/ant

    後來更改系統屬性不具有任何影響真正的早期評價。你仍然可以使用(或濫用?)的類加載器:

    System.setProperty("java.library.path", "/path/to/ant"); 
    
    Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); 
    fieldSysPath.setAccessible(true); 
    fieldSysPath.set(null, null); 
    
    +0

    將ant庫添加到您的classapth並將調用Runtmie.exec(...)與 – Verhagen

    1

    如果你不介意的常規添加到類路徑,你可以使用AntBuilder

    1

    不同的方法

    加入螞蟻庫您的分類和替換呼叫Runtmie.exec(...)org.apachetools.ant.Main.main(...)

    這更穩定,並且不依賴於本地Ant安裝。這需要在系統環境PATH中,或使用Runtime.exec(...)中的完整路徑調用

    這將使Ant成爲創建的應用程序的一部分,而不是外部調用的應用程序。