是否可以在运行时从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命令。不过我还没有尝试过这种方法。