我想从我的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;
}
如果你不介意将groovy添加到你的类路径中,你可以使用AntBuilder
你需要
- 包含每个可执行文件的路径,以便java
exec()
知道在哪里找到它。
或
- 调用蚂蚁的绝对路径。
第一个任务有点复杂,因为PATH环境变量是在引导过程的早期评估的(例如java -Djava.library.path=/path/to/ant
)
以后更改system属性没有任何影响。您仍然可以使用(或滥用?)类装入器:
System.setProperty( "java.library.path", "/path/to/ant" );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
不同的方法
将Ant库添加到类路径中,并将调用Runtmie.exec(...)
替换为org.apachetools.ant.Main.main(…)
这更稳定,并且不依赖于本地Ant安装。它需要在系统环境PATH
上,或者使用Runtime.exec(...)