是否可以从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文件,它没有“告诉”任何东西(没有控制台输出),但是它起作用了 :文件确实被移动了

       

当我再次尝试时(当没有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命令的String或ant命令的shell脚本;

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

*自我编辑以进行预告

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

例如:

  ProcessBuilder pb = new ProcessBuilder("path/to/my/script/script.sh"); Map 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命令即可。 我没有尝试过这种方法。