我正在用速度模板引擎为OSGi开发一个应用程序。它可以很好地通过文件加载器加载我的模板,但现在我必须在jar中实现这个模板,并将其作为资源加载。
我怎么才能让它起作用?
我的守则:
ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class",
ClasspathResourceLoader.class.getName());
ve.setProperty("classpath.resource.loader.path", "/velocitytemplates");
ve.init();
ve.getTemplate("foo.vm");这将引发一个异常,如
无法找到资源“index.vm”
原因如下:
org.apache.velocity.exception.ResourceNotFoundException:无法找到资源'index.vm'
发布于 2012-07-11 16:21:34
可悲的是,速度并不是那么友好的OSGi。因此,您不能使用内置的ClasspathResourceLoader,也很难添加自定义开发的ResourceLoader。
我建议您以任何一种普通的方式获得您的模板作为阅读器,并选择下列之一:
如果您很少需要合并模板(性能没有多大关系),
的内部类。
如果不需要经常合并模板,则可以使用第一个选项,因此性能不是关键要求。
下面是第二个选项的示例,其中创建的模板对象可以通过调用其上的merge函数来重用(期望您已经获得vm文件或资源的Reader ):
RuntimeInstance runtimeInstance = new RuntimeInstance();
runtimeInstance.init();
SimpleNode simpleNode = runtimeInstance.parse(reader, "nameOfYourTemplateResource");
Template template = new Template();
simpleNode.init(new InternalContextAdapterImpl(new VelocityContext()), runtimeInstance);
template.setData(simpleNode);
template.merge(...);
...要在OSGi中获得vm文件的读取器,您应该选择一个与vm资源相同的类,并调用SameBundleClass.class.getResourceAsStream.您可以使用InputStreamReader than将您的流转换为编写器。
请注意,该示例遗漏了一些尝试-捕获-最后块。
发布于 2011-12-23 00:08:09
有两件事需要验证
1. Classpath问题
确保通过OSGi设置MANIFEST.MF包的类路径以包括一个点:
Bundle-ClassPath: .点意味着在类加载层次结构中包含包的根,您的文件夹"velocitytemplates“可能驻留在这个层次结构中。
而且您需要在您的模板所在的同一个包中拥有速度jar文件,因为否则您将得到类加载问题,因为流速将驻留在不同的包中,因此它的类路径中根本看不到"velocitytemplates“。
2. ClasspathResourceLoader没有“路径”
ClasspathResourceLoader不支持设置“路径”,因为它根据定义使用Classpath,所以要么在OSGi包(MANIFESt.MF)中向Classpath中添加"velocitytemplates“,要么用完整路径引用速度模板,即"velocitytemplates/index.vm”
发布于 2012-03-13 23:25:42
在基于类加载器的模板中,我遇到了一个类似的问题,我想指定一个不同的根。我通过子类ClasspathResourceLoader来解决这个问题。
package my.package;
import java.io.InputStream;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
public class PrefixedClasspathResourceLoader
extends ClasspathResourceLoader
{
/** Prefix to be added to any names */
private String prefix = "";
@Override
public void init(ExtendedProperties configuration) {
prefix = configuration.getString("prefix","");
}
@Override
public InputStream getResourceStream(String name)
throws ResourceNotFoundException
{
return super.getResourceStream(prefix+name);
}
}设置了以下属性
resource.loader=myloader
myloader.resource.loader.class=my.package.PrefixedClasspathResourceLoader
myloader.resource.loader.prefix=/velocitytemplates/这样,如果您有一个名为"index.vm“的模板,那么速度将使用类加载器找到一个名为"/velocitytemplates/index.vm”的资源。
https://stackoverflow.com/questions/8603546
复制相似问题