是否可以在运行时从Java代码以编程方式调用Ant或NSIS脚本?如果是这样,怎么样?
答案 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命令即可。我没有尝试过这种方法。