我使用FreeMarker已经有一段时间了,但是有一个明显的功能缺失了,或者我就是想不通(我希望是后者!)。如果向cfg.getTemplate()传递一个绝对路径,它就不起作用。我知道你可以指定一个模板目录,但是我负担不起,我的用例可以处理任何目录中的文件。是否有任何方法可以设置freemarker以按照任何用户期望的方式呈现绝对路径?

最佳答案

我不得不使用绝对路径,因为模板是在一个ant脚本中进行的,模板在文件系统中,并且是用一个ant文件集发现的。我想这些是非常独特的要求…
不管怎样,对于后人来说(只要有机会),这里有一个可行的解决方案:

public class TemplateAbsolutePathLoader implements TemplateLoader {

    public Object findTemplateSource(String name) throws IOException {
        File source = new File(name);
        return source.isFile() ? source : null;
    }

    public long getLastModified(Object templateSource) {
        return ((File) templateSource).lastModified();
    }

    public Reader getReader(Object templateSource, String encoding)
            throws IOException {
        if (!(templateSource instanceof File)) {
            throw new IllegalArgumentException("templateSource is a: " + templateSource.getClass().getName());
        }
        return new InputStreamReader(new FileInputStream((File) templateSource), encoding);
    }

    public void closeTemplateSource(Object templateSource) throws IOException {
        // Do nothing.
    }

}

初始化是:
public String generate(File template) {

    Configuration cfg = new Configuration();
    cfg.setTemplateLoader(new TemplateAbsolutePathLoader());
    Template tpl = cfg.getTemplate(template.getAbsolutePath());

    // ...
}

关于java - 在FreeMarker中使用绝对路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1208220/

10-11 10:32