【发布时间】:2016-06-21 21:24:28
【问题描述】:
我正在编写一个自定义的Ant任务来处理一些业务逻辑,我想调用MoveAnt任务。
我想我会使用 Execute java 类,但我无法弄清楚。
我是朝着正确的方向前进,还是不能以 Ant 的方式从另一个类调用一个类?
【问题讨论】:
标签: ant
我正在编写一个自定义的Ant任务来处理一些业务逻辑,我想调用MoveAnt任务。
我想我会使用 Execute java 类,但我无法弄清楚。
我是朝着正确的方向前进,还是不能以 Ant 的方式从另一个类调用一个类?
【问题讨论】:
标签: ant
对于您的任务,您想调用Move 任务。所以你想移动一些文件。
通常,在使用 Java 编码时,应避免调用内置的 Ant 任务,因为它们通常性能较差。例如,您可以使用来自java.io.File 的File.renameTo() 方法或来自java.nio.file.Files 的Files.move()(仅限JDK7)。
如果您确实想利用一些 Ant 功能,例如 <fileset>,您可能希望您的任务能够将 Move 任务作为构建 xml 中的嵌套任务。只需将您的任务设为TaskContainer 并在其方法中进行一些过滤。
当然,您也可以只导入移动任务,设置所有需要的属性,然后调用其execute() 方法。但我不喜欢那样。
【讨论】:
Something sth = new Something(),sth.setXXX(xxx),然后是sth.execute()。
上述答案没有回答原始问题“您可以从自定义 Ant 任务中执行 Ant 任务吗?”
答案是肯定的。
这是一个复制的例子。移动类似。尽管File.renameTo() 可能比调用 Ant Move 任务具有更好的性能,但您可能希望从自定义 Ant 任务中调用 Ant 任务肯定是有原因的,尤其是在不存在合适的 JRE 替代方案的情况下。 Ant API 非常广泛,并提供了大量有用的任务。此外,您可能希望从不同的自定义 Ant 任务中调用自定义 Ant 任务。
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.taskdefs.Copy;
...
// set up the Strings inputPath and outputPath appropriately...
...
try{
FileSet inputSet = new FileSet(); // what to copy FROM
inputSet.setDir(new File(inputPath));
Copy copyTask = new Copy();
copyTask.setProject(getProject());
copyTask.setTodir(outputPath); // where to copy TO
copyTask.setFailOnError(true);
copyTask.addFileset(inputSet);
copyTask.execute();
}
catch(Exception e){
String msg = "Exception while invoking Copy task with inputPath=\"" + inputPath + "\" and outputPath=\"" + outputPath + "\": " + e.toString();
throw new BuildException(msg, e);
}
【讨论】: