问题出在 FreeMarker 的FileTemplateLoader
课程上。它对baseDir.getCanonicalFile(...)
传递给构造函数的基目录进行调用。当我们的应用程序启动时,基目录/var/cms/live
被解析为真实路径/var/cms/trunk/127/
,getCanonicalFile(...)
因此将来对符号链接的任何更改都将被忽略。
它在构造函数中执行此操作,因此我们被迫创建自己的LocalFileTemplateLoader
,如下所示。
它只是一个基本的弹簧加载实现TemplateLoader
。然后,当我们构建 FreeMarker 配置时,我们设置模板加载器:
Configuration config = new Configuration();
LocalTemplateLoader loader = new LocalTemplateLoader();
// this is designed for spring
loader.setBaseDir("/var/cms/live");
config.setTemplateLoader(loader);
...
这是我们的LocalFileTemplateLoader
代码。 关于 pastebin 的完整课程:
public class LocalFileTemplateLoader implements TemplateLoader {
public File baseDir;
@Override
public Object findTemplateSource(String name) {
File source = new File(baseDir, name);
if (source.isFile()) {
return source;
} else {
return null;
}
}
@Override
public long getLastModified(Object templateSource) {
if (templateSource instanceof File) {
return new Long(((File) templateSource).lastModified());
} else {
throw new IllegalArgumentException("templateSource is an unknown type: " + templateSource.getClass());
}
}
@Override
public Reader getReader(Object templateSource, String encoding) throws IOException {
if (templateSource instanceof File) {
return new InputStreamReader(new FileInputStream((File) templateSource), encoding);
} else {
throw new IllegalArgumentException("templateSource is an unknown type: " + templateSource.getClass());
}
}
@Override
public void closeTemplateSource(Object templateSource) {
// noop
}
@Required
public void setBaseDir(File baseDir) {
this.baseDir = baseDir;
// it may not exist yet because CMS is going to download and create it
}
}