【问题标题】:how to use Apache Ant's task in my Java code如何在我的 Java 代码中使用 Apache Ant 的任务
【发布时间】:2012-11-29 16:33:42
【问题描述】:

我想在我的代码中使用 Ant 的一项任务 (scp)。有什么办法吗?

我是否应该简单地引用 Ant 的一个库并直接从我的代码中调用 API?

【问题讨论】:

    标签: java ant scp


    【解决方案1】:

    是的,您可以很容易地从您的代码中调用 Ant 任务。

    这是一个如何扩展 Ant 任务的示例:

    import org.apache.tools.ant.Project;
    import org.apache.tools.ant.Target;
    import org.apache.tools.ant.taskdefs.Copy;
    
    public class MyCopyTask extends Copy {
        public MyCopyTask() {
            setProject(new Project());
            getProject().init();
            setTaskName("MyCopy");
            setTaskType("MyCopy");
            setOwningTarget(new Target());
        }
    }
    

    以下是如何在您的代码中使用它:

    MyCopyTask copier = new MyCopyTask();
    copier.setFile(srcFile);
    copier.setTofile(toFile);
    copier.execute();
    

    这里有更多信息:

    【讨论】:

    • 是什么让这比简单的系统调用更好?
    • @foampile - 引用链接:它是跨平台的、强大的并且受益于社区支持。此外,就像任何库一样,Ant Tasks 包含大量选项,您可以使用它们来代替您自己实现它们。例如,使用复制任务,您可以通过简单地设置布尔字段轻松指定是否覆盖现有文件。此外,当您进行“simple”系统调用时,可能会出现很多问题。我宁愿让 Apache 的代码处理其中的一些错误。在执行 scp 时我会考虑所有可能出错的事情!
    • 这里是复制任务源代码的链接...如您所见,您可以利用 TONS 选项(我讨厌自己实现所有这些):docjar.com/html/api/org/apache/tools/ant/taskdefs/…
    • 查看您的答案后,您似乎在建议使用简单的系统调用来调用 Ant 任务。所以......公平地说,这确实利用了我提到的东西。我仍然认为通过扩展 Ant 任务来创建实用程序例程比依赖在您通过系统调用调用的某处预定义 Ant 任务更通用。也许我误解了你的答案......
    • 我喜欢你这样做的方式,虽然更长,但更干净。这一切都取决于应用程序及其核心功能的多少。如果他只是想快速自动化一项他预计不需要在另一个操作系统上运行的任务,那么我的方法是合理的。如果他正在实现,比如说一个 web 控制台,用户将有一个 ant 作业的接口,即 ant 调用是核心应用程序功能,那么也许使用你所做的。
    【解决方案2】:

    这肯定会在您的 Java 代码中包含 Ant 任务。作为最后的手段,我们以前曾这样做过。一个问题是你可能会设置一些 Ant 特定的属性(例如 setProject)来让任务真正工作。这可能会使其使用起来有点尴尬。此外,正如您所提到的,您可能需要 Ant 运行时库来运行它。

    我的第一个建议是看看是否有一种方法可以直接调用您想要的实际 SCP 代码,而无需 Ant 开销。第二种选择是寻找 Java SCP 库或找出 Ant scp 任务正在使用什么。有关更多示例,请参阅scp via java。最后的建议是包含上述 Ant 任务。

    【讨论】:

      【解决方案3】:

      我认为调用系统调用会更简单:

      try {
                  Runtime.getRuntime().exec("ant scpTask");
              } catch (IOException e) {
                  e.printStackTrace();
              }
      

      【讨论】:

        【解决方案4】:

        我认为Runtime.getRuntime().exec("ant deploy"); 取决于您的操作系统,如果您只是在一个固定的操作系统中运行它,这确实是一种更简单、更容易获得所需内容的方法。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-02
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 2012-12-13
          • 1970-01-01
          相关资源
          最近更新 更多