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



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

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

请参阅本文(向下滚动到"通过Java运行Ant"部分)和本文:

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

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

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

这只是一个基本的设置,使用Ant Java API可以做更多的事情。

是的,Nivas给出了最具体的答案,可能也是最好的答案,但称我为老派,我仍然更喜欢这样做:

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

其中command是包含ant命令的字符串,或者是ant命令的shell脚本;

如果你不需要所有的"铃声和口哨声",我承认这很酷,那么以后要管理的代码就更少了。按照我的方式,你不能逐步调试蚂蚁的调用。权衡的结果是,您的文件需要放在具有特殊名称的特殊位置,但无论如何,Java在这方面已经有点强迫症了。(不要激怒我。;)Java也是我最喜欢的语言,但拜托,我们在这里谈论的是部署选项,你知道它在部署选项领域有点强迫症,对吧?)我想我真正想说的是"用突击队的刀在吐司上涂黄油可能太过分了。"

*自编辑用于预处理

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命令。不过我还没有尝试过这种方法。

相关内容

  • 没有找到相关文章

最新更新