I'm getting ResourceNotFoundException errors using Velocity (1.7) in a web
application.  The following is the error I get but its somewhat random.

org.apache.velocity.exception.ResourceNotFoundException: Unable to find
resource 'Body-1_v2.vm'

Or

org.apache.velocity.exception.ResourceNotFoundException: Unable to find
resource 'Body-1.vm'

My application is an EAR running in Wildfly.  The EAR has several web apps
(Wars).  Each of the Wars is a service that uses velocity each with two
templates that generates email content.  There are close to 20 services
like this and they work fine with velocity.  However I have two that are
somewhat different, I've had one of these different ones for a long time
w/o trouble but now that I have two 'different' ones I get the above error.

These 'different' services use Quartz to schedule a job that uses
Velocity.  The Quartz job will fire and it will create a new instance of
the Job and those Job instances create new instances of VelocityEngine
& VelocityContext.  I use the following configuration for Velocity in all
the apps.


Properties properties = new Properties();
properties.put("resource.loader", "class");
properties.put("class.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
properties.put("class.resource.loader.description", "Load resources from
the CLASSPATH");

properties.put("runtime.log.logsystem.class",
"org.apache.velocity.runtime.log.Log4JLogChute");
properties.put("runtime.log.logsystem.log4j.category", "velocity");
properties.put("runtime.log.logsystem.log4j.logger", "velocity");

velocityEngine = new VelocityEngine();
velocityEngine.init(properties);

Then when I use the template I have:

VelocityContext velocityContext = new VelocityContext();
velocityContext.put("updatedRates", updatedRates);

StringWriter writer = new StringWriter();
velocityEngine.mergeTemplate("Body-1_v2.vm", "utf-8", velocityContext,
writer);
String s = writer.toString();

Where 'Body-1_v2.vm' is in the War's classpath, e.g.
WEB-INF/classes/Body-1_v2.vm

My wars are skinny in that all of their jars are loaded from the Ear's lib
folder but each War has its custom code and resources in its
WEB-INF/classes folder

This does work sometimes, it seems that one of these Quartz fired apps will
work but not both (one is a second version of the other).

So it seems to be there is a bug in Velocity's resource loader in that it
can't property resolve the classpath when velocity is loaded by a thread
created by Quartz (which was loaded by the web app).

How can I fix this?  How can I be more explicit in telling Velocity where
the resources are regardless of what thread launched Velocity?

-Dave

Reply via email to