是否可以从Java代码调用Ant或NSIS脚本?

时间:2011-06-22 13:01:20

标签: java ant nsis

是否可以在运行时从Java代码以编程方式调用Ant或NSIS脚本?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:15)

可以从Java代码中调用ant脚本。

请参阅this article(向下滚动到“通过Java运行Ant”部分)和this article

   File buildFile = new File("build.xml");
   Project p = new Project();
   p.setUserProperty("ant.file", buildFile.getAbsolutePath());
   p.init();
   ProjectHelper helper = ProjectHelper.getProjectHelper();
   p.addReference("ant.projectHelper", helper);
   helper.parse(p, buildFile);
   p.executeTarget(p.getDefaultTarget());

<强>更新

我尝试使用以下ant文件,它没有“告诉”任何内容(没有控制台输出),但工作:文件确实被移动了

   <project name="testproject" default="test" basedir=".">
      <target name="test">
        <move file="test.txt" tofile="test2.txt" />
      </target>
   </project>

当我再次尝试时(当没有test.txt移动时(已经移动)),我得到了java.io.FileNotFoundException

我认为这是您从Java运行时所期望的。

如果您想要ant任务的控制台输出,您可能希望将Logger添加为构建侦听器。

来自@ Perception的答案。

   DefaultLogger consoleLogger = new DefaultLogger();
   consoleLogger.setErrorPrintStream(System.err);
   consoleLogger.setOutputPrintStream(System.out);
   consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
   p.addBuildListener(consoleLogger);

答案 1 :(得分:2)

过分扩展Nivas的答案 - 他的解决方案是正确的,你没有看到你的程序的输出,因为你没有将任何记录器附加到你的项目。

DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);

这只是基本设置,您可以使用Ant Java API进行更多操作。

答案 2 :(得分:0)

是的,Nivas给出了最具体的答案,可能也是最好的答案,但是我称之为老式,我还是喜欢这样做:

Process child = Runtime.getRuntime().exec(command);

其中command是带有ant命令的String或ant命令的shell脚本;

如果你不需要所有的“花里胡哨”,我承认这很酷,那么以后管理的代码就少了。我的方式是你没有按步骤调试ant调用。权衡的是你的文件需要在特殊名称的特殊地方,但无论如何,Java在这方面已经是一个小的强迫症。 (不要惹我生气。;)Java也是我最喜欢的语言,但是来吧,我们在这里讨论部署选项,你知道它在部署选项区域有点强迫症,对吗?)我想全部我真的在暗示:“使用突击刀来涂抹烤面包可能会过度杀戮。”并考虑到这一点。 ;)

*自我编辑以进行预告

答案 3 :(得分:0)

user804965的解决方案是我之前实现的解决方案。我不得不从Java运行一些终端命令,并使用Process和Runtime Java对象。同样的想法可以应用于运行ant命令。

例如:

  ProcessBuilder pb = new ProcessBuilder("path/to/my/script/script.sh");
  Map<String, String> env = pb.environment();
  Process p = pb.start();
  p.waitFor();
  BufferedReader buf = new BufferedReader(new InputStreamReader(
          p.getInputStream()));
  String line = "";
  while ((line = buf.readLine()) != null) {
    System.out.println(line);
  }

这将从Java运行脚本文件并将输出打印到控制台。在script.sh里面你可以做一些......

cd /path/to/my/build.xml/file/; ant -p

或者调用您需要调用的任何ant脚本(例如,ant clean)。

您也可以在没有附加sh文件的情况下执行此操作,只需从Java调用terminal命令即可。我没有尝试过这种方法。