在JAR中引用Ant build.xml



我正在通过一个可执行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
            }
        }
    }
}

无论如何,这对我的目的来说已经足够好了。

最新更新