从java类执行ant脚本

时间:2015-10-14 14:25:54

标签: java ant

我想从我的java类运行一个ant脚本runANTScript.xml。该脚本位于我的Web应用程序的SCRIPTS /文件夹中。我试图像这样运行文件

    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;
    }

3 个答案:

答案 0 :(得分:1)

你需要

  1. 包含ant可执行文件的路径,以便java exec()知道在哪里找到它。
    1. 使用绝对路径调用ant。
    2. 第一项任务有点复杂,因为在启动过程中很早就评估了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 );
      

答案 1 :(得分:1)

如果您不介意在您的类路径中添加groovy,可以使用AntBuilder

答案 2 :(得分:1)

不同方法

将Ant库添加到您的classapth并将call Runtmie.exec(...)替换为 org.apachetools.ant.Main.main(...)

这更稳定,并且不依赖于本地Ant安装。哪个需要在系统环境PATH上,或者使用Runtime.exec(...)

中的完整路径调用

这将使Ant成为创建的applciation的一部分,而不是外部调用的应用程序。