Loading velocity template inside a jar file
        Posted  
        
            by Rafael
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Rafael
        
        
        
        Published on 2010-05-28T18:22:13Z
        Indexed on 
            2010/05/28
            18:42 UTC
        
        
        Read the original article
        Hit count: 350
        
I have a project where I want to load a velocity template to complete it with parameters. The whole application is packaged as a jar file. What I initially thought of doing was this:
VelocityEngine ve = new VelocityEngine();
   URL url = this.getClass().getResource("/templates/");
   File file = new File(url.getFile());
   ve = new VelocityEngine();
   ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "file");
   ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath());
   ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, "true");
   ve.init();
   VelocityContext context = new VelocityContext();
   if (properties != null) {
    stringfyNulls(properties);
    for (Map.Entry<String, Object> property : properties.entrySet()) {
     context.put(property.getKey(), property.getValue());
    }
   }
   final String templatePath = templateName + ".vm";
   Template template = ve.getTemplate(templatePath, "UTF-8");
   String outFileName = File.createTempFile("p2d_report", ".html").getAbsolutePath();
   BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outFileName)));
   template.merge(context, writer);
   writer.flush();
   writer.close();
And this works fine when I run it in eclipse. However, once I package the program and try to run it using the command line I get an error because the file could not be found.
I imagine the problem is in this line:
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath());
Because in a jar the absolute file does not exist, since it's inside a zip, but I couldn't yet find a better way to do it.
Anyone has any ideas?
© Stack Overflow or respective owner