use*_*578 9 java osgi velocity
我正在开发一个带速度模板引擎的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");
Run Code Online (Sandbox Code Playgroud)
这将抛出一个例外
无法找到资源'index.vm'
引起:
org.apache.velocity.exception.ResourceNotFoundException:无法找到资源'index.vm'
可悲的是Velocity并不是OSGi友好的.因此,您无法使用内置的ClasspathResourceLoader,也很难添加自定义开发的ResourceLoader.
我建议您以任何常规方式将模板作为Reader使用,并选择以下选项之一:
如果您不必经常合并模板,则可以使用第一个选项,因此性能不是关键要求.
下面是第二个选项的示例,其中可以通过调用其上的合并函数来重用创建的模板对象(期望您已经有一个读取器到您的vm文件或资源):
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(...);
...
Run Code Online (Sandbox Code Playgroud)
要获得OSGi中vm文件的读者,您应该选择一个肯定与vm资源在同一个包中的类,并调用SameBundleClass.class.getResourceAsStream ...您可以使用InputStreamReader将您的流转换为writer.
请注意,该示例错过了一些try-catch-finally块.
有两件事需要验证
确保通过 MANIFEST.MF 设置 OSGi 包的类路径以包含一个点:
Bundle-ClassPath: .
Run Code Online (Sandbox Code Playgroud)
点表示将包的根包含在类加载层次结构中,您的文件夹“velocitytemplates”可能位于其中。
并且您需要将 Velocity jar 文件放在模板文件所在的同一个包中,否则您将遇到类加载问题,因为 Velocity 将驻留在不同的包中,因此根本看不到“velocitytemplates”类路径。
ClasspathResourceLoader 不支持设置“路径”,因为它根据定义使用类路径,因此要么将“velocitytemplates”添加到 OSGi 包 (MANIFESt.MF) 中的类路径,要么引用具有完整路径的速度模板,即“velocitytemplates/index” .vm"