2014-04-23 1 views
0

J'exécute une tâche ANT en utilisant du code Java, via un fichier exécutable. Je voudrais inclure le fichier build.xml dans le fichier JAR exécutable, mais je ne vois pas comment le référencer dans mon code. Toute aide est appréciée.Référencement de Ant build.xml dans JAR

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"); 
} 

Si je crée un objet java.io.File qui fait référence à un fichier build.xml externe et précise que, dans ph.parse, cela fonctionne ... Si je tente de référencer un fichier qui est emballé dans le JAR, cela ne . J'ai validé (via 7-ZIP) que le fichier report.xml est, en fait, à la racine du JAR.

Répondre

0

Eh bien, malheureusement, je n'ai jamais vraiment compris. Vous pouvez, cependant, faire ce qui suit:

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 
      } 

     } 
    } 
} 

Cela fonctionne assez bien pour mes fins de toute façon.