我有一个项目,我想加载一个速度模板完成它的参数。整个应用程序被打包为一个jar文件。我最初想做的是这样的:
VelocityEngine ve = new VelocityEngine();
URL url = this.getClass().getResource("/templates/");
File file = new File(url.getFile());
ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "file");
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath());
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, "true");
ve.init();
VelocityContext context = new VelocityContext();
if (properties != null) {
stringfyNulls(properties);
for (Map.Entry<String, Object> property : properties.entrySet()) {
context.put(property.getKey(), property.getValue());
}
}
final String templatePath = templateName + ".vm";
Template template = ve.getTemplate(templatePath, "UTF-8");
String outFileName = File.createTempFile("report", ".html").getAbsolutePath();
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outFileName)));
template.merge(context, writer);
writer.flush();
writer.close();
当我在eclipse中运行时,这个工作得很好。然而,一旦我打包程序并尝试使用命令行运行它,我得到一个错误,因为文件找不到。
我想问题出在这一行:
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath());
因为在jar中绝对文件是不存在的,因为它在zip中,但是我还没有找到更好的方法。
有人有什么想法吗?
5条答案
按热度按时间hujrc8aj1#
如果你想使用classpath中的资源,你应该使用classpath的资源加载器:
btxsgosb2#
最终代码,使用上面两个答案中提出的想法开发:
watbbzwu3#
除非JAR被分解,否则您不能将JAR中的资源作为文件读取。使用输入流。
请参阅以下代码片段,
xqk2d5yq4#
要使Velocity在类路径中查找模板,请执行以下操作:
ajsxfq5m5#
也许我有一个旧版本,这是唯一对我有效的东西