Exception in thread “main” org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource ‘hellovelocity.vm’
我想相信第一次使用Velocity的时候,看了网上的很多资料,然后相关的文档整理后,就会发现,怎么都跑不通,然后在网上查找后,就会发现,他们提供的答案也是千篇一律,无法满足自己的需求,还是不知道怎么办。今天我就碰到了这样的问题,感觉看了网上的很多解释,都是很模糊,还是不知道怎么办。但是终于通过自己的努力把以上的问题解决了。现在把这个程序的完整结构,包括velocity的vm文件放置位置以及程序的代码全部给发大家分享,希望能够用最快的时候解决大家的问题,毕竟对程序员而言,时间就是金钱。
第一:为什出现以上的问题?
最简单的解释就是找不到具体的vm文件,所以这个vm文件的位置是非常关键的,必须放在velocity源码要求的位置,所以这是非常关键。
所以我们觉得代码中就是直接写对应的vm文件。其实不是这样的,加载vim文件需要在已经编译好的class文件中找到对应的vm文件。
所以,首先我们放置的vm文件的位置就是错误的。那应该放在那里呢?
第二步:认真看代码
我这方的是正确的代码,大家直接复制就可以了,我会通过这段代码给大家介绍,怎么根据代码来放置对应的vm文件,进而程序能够读取vm文件,运行出争取结果。
VelocityEngine ve = new VelocityEngine();
String fileDir = HelloVelocity.class.getResource("/template").getPath();
//HelloVelocity 这个是本程序的类名
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
System.out.println(fileDir);
Properties properties = new Properties();
properties.setProperty(ve.FILE_RESOURCE_LOADER_PATH,fileDir);
ve.init(properties);
System.out.println("测试:hello world");
// 获取模板文件
Template t = ve.getTemplate("velocity.vm");
// 设置变量
VelocityContext ctx = new VelocityContext();
ctx.put("name", "Velocity");
List list = new ArrayList();
list.add("1");
list.add("2");
ctx.put("list", list);
// 输出
StringWriter sw = new StringWriter();
t.merge(ctx,sw);
System.out.println(sw.toString());
通过上面的代码我们可以发现,
HelloVelocity.class.getResource("/template").getPath()
这个句话的意思就是从类对应的class文件中找到对应目录的路径名称,这里不要太过于把什么绝对路径和相对路径区分的过于清楚,只需要知道,是得到class文件中的某个目录的路径就可以了。
所说义这句话的就我们一个重要的提示,那就是我们需要把对应的template目录新建在对应的类编译后的class目录中。
第三步:怎么查找类编译后形成的目录
这个就是Java的基础知识,我们知道类在编译之后,是放在对应的bin中的,所以我们就需要找到我们程序存放的位置,然后在找到本程序的bin目录,然后在里边新建一个template,在里边放入具体的vm文件,这样才可以,具体如下图所示:
第四步:最后运行程序,得到结果
在本程序中,核心就是将template和vm文件的存放位置,所以,这才是核心,大家一定要记着,式存储在类编译后的bin文件中的。
jar包下载链接
最后velocity的jar包也是一个核心问题,很多同学都不知道怎么找,虽然给了官网,但是里边还是很多内容,不知道怎么找,这里把下载的直接网址给大家,减少大家寻找jar包的时间。
http://archive.apache.org/dist/velocity/engine/1.7/