What's the easiest way to render a velocity template from Java code?

Use VelocityUtils. You will need to provide VelocityUtils with the name of the template you want to render, and a map of parameters that will be made available within the template as $variables in velocity.

Confluence has a default set of objects for Confluence velocity templates. These are required for most Confluence velocity macros to work properly. To obtain this context, you should call MacroUtils.defaultVelocityContext();.

// Create the Velocity Context
HashMap context = MacroUtils.defaultVelocityContext();
context.put("myCustomVar", customVar);
context.put("otherCustomVar", otherCustomVar);
// Render the Template
String result = VelocityUtils.getRenderedTemplate("/com/myplugin/templates/macro.vm", context);