Great question - I solved my issue today as follows using Ecilpse:
Put your template in the same folder hierarchy as your source code (not in a separate folder hierarchy even if you include it in the build path) as below:
In your code simply use the following lines of code (assuming you just want the date to be passed as data):
VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
ve.init();
VelocityContext context = new VelocityContext();
context.put("date", getMyTimestampFunction());
Template t = ve.getTemplate( "templates/email_html_new.vm" );
StringWriter writer = new StringWriter();
t.merge( context, writer );
See how first we tell VelocityEngine to look in the classpath. Without this it wouldn't know where to look.
~ Answered on 2012-12-04 04:13:44