Raf*_*ael 45 java templates velocity jar classpath
我有一个项目,我想加载一个速度模板来完成它与参数.整个应用程序打包为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();
Run Code Online (Sandbox Code Playgroud)
当我在eclipse中运行时,这很好用.但是,一旦我打包程序并尝试使用命令行运行它,我得到一个错误,因为找不到该文件.
我想问题就在这一行:
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, file.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
因为在jar中绝对文件不存在,因为它在zip中,但我还没有找到更好的方法来做到这一点.
有人有什么想法吗?
axt*_*avt 73
如果要使用类路径中的资源,则应使用资源加载器进行类路径:
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
Run Code Online (Sandbox Code Playgroud)
Raf*_*ael 20
最终代码,使用上述两个答案中提出的想法开发:
VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
ve.init();
final String templatePath = "templates/" + templateName + ".vm";
InputStream input = this.getClass().getClassLoader().getResourceAsStream(templatePath);
if (input == null) {
throw new IOException("Template file doesn't exist");
}
InputStreamReader reader = new InputStreamReader(input);
VelocityContext context = new VelocityContext();
if (properties != null) {
stringfyNulls(properties);
for (Map.Entry<String, Object> property : properties.entrySet()) {
context.put(property.getKey(), property.getValue());
}
}
Template template = ve.getTemplate(templatePath, "UTF-8");
String outFileName = File.createTempFile("report", ".html").getAbsolutePath();
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outFileName)));
if (!ve.evaluate(context, writer, templatePath, reader)) {
throw new Exception("Failed to convert the template into html.");
}
template.merge(context, writer);
writer.flush();
writer.close();
Run Code Online (Sandbox Code Playgroud)
除非JAR爆炸,否则您无法将JAR中的资源作为文件读取.使用输入流.
请参阅以下代码段,
InputStream input = classLoader.getResourceAsStream(fileName);
if (input == null) {
throw new ConfigurationException("Template file " +
fileName + " doesn't exist");
}
InputStreamReader reader = new InputStreamReader(input);
Writer writer = null;
try {
writer = new OutputStreamWriter(output);
// Merge template
if (!engine.evaluate(context, writer, fileName, reader))
......
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35737 次 |
| 最近记录: |