我正在通过一个可执行jar使用Java代码执行一个ANT任务。我想在可执行JAR中包含build.xml,但不知道如何在代码中引用它。感谢您的帮助。
public static void main(String[] args) {
BuildLogger logger = new DefaultLogger();
logger.setMessageOutputLevel(Project.MSG_INFO);
logger.setOutputPrintStream(System.out);
logger.setErrorPrintStream(System.out);
logger.setEmacsMode(true);
ProjectHelper ph = ProjectHelper.getProjectHelper();
Project p = new Project();
p.addBuildListener(logger);
p.init();
p.addReference("ant.projectHelper", ph);
//File f = new File(this.getClass().getResource("/report.xml").toURI()); I can't do toURI on this, it throws an exception
ph.parse(p, this.getClass().getResource("/report.xml")); //This throws a NullPointerException within ANT
p.executeTarget("dumpandreport");
}
如果我创建了一个引用外部build.xml文件的java.io.File
对象,并在ph.parse
中指定该对象,这将起作用。。。如果我试图引用一个打包在JAR中的文件,这不会。我已经(通过7-ZIP)验证了文件report.xml
实际上在JAR的根目录中。
令人失望的是,我从来没有完全弄清楚这一点。但是,您可以执行以下操作:
public static void main(String[] args) {
...
ph.parse(p, getAntXML()};
...
}
private Object getAntXML() throws IOException {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = this.getClass().getResourceAsStream("/report.xml");
File f = File.createTempFile("report", "xml");
outputStream = new FileOutputStream(f);
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
return f;
} catch (IOException ex) {
throw ex;
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
//Nop
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
//Nop
}
}
}
}
无论如何,这对我的目的来说已经足够好了。