Java 谷歌应用程序引擎上的ServletContext在哪里;上下文“;在类路径中?

Java 谷歌应用程序引擎上的ServletContext在哪里;上下文“;在类路径中?,java,google-app-engine,servlets,freemarker,Java,Google App Engine,Servlets,Freemarker,我想在我的Google App Engine java应用程序中部署一些Freemarker模板,用作电子邮件正文模板。我正在使用freemarker-gae-2.3.23.jar 我的问题是,我应该将模板文件放在war文件中的什么位置,以便Freemarker配置类可以找到它们?我原以为WEB-INF/classes/templates可以工作,但当我在GAE实例上运行它时,出现了以下错误。getRealPath()也不提供任何洞察。返回空字符串。非常感谢您的任何想法或建议 SEVERE: T

我想在我的Google App Engine java应用程序中部署一些Freemarker模板,用作电子邮件正文模板。我正在使用freemarker-gae-2.3.23.jar

我的问题是,我应该将模板文件放在war文件中的什么位置,以便Freemarker配置类可以找到它们?我原以为WEB-INF/classes/templates可以工作,但当我在GAE实例上运行它时,出现了以下错误。getRealPath()也不提供任何洞察。返回空字符串。非常感谢您的任何想法或建议

SEVERE: Template ./templates/invitation.ftl not found.
java.lang.RuntimeException: Error in loading ftl template: Template ./templates/invitation.ftl not found.
我的基本配置如下:

public class FreeMarkerConfig {

private static FreeMarkerConfig freeMarkerConfig = null;
private static Configuration cfg = null;
private static final Logger logger =   Logger.getLogger(FreeMarkerConfig.class.getName());

private FreeMarkerConfig(ServletContext context){
    cfg = new Configuration();
    cfg.setServletContextForTemplateLoading(context, "/templates");
}

public static FreeMarkerConfig getInstance(ServletContext context){
    if(freeMarkerConfig == null){

        freeMarkerConfig = new FreeMarkerConfig(context);
        return freeMarkerConfig;
    }
    return freeMarkerConfig;
}

public static Template getTemplateByName(String fileName){
    try {
        return cfg.getTemplate(fileName);
    } catch(IOException e) {
        logger.severe(e.getMessage());
        e.getStackTrace();
        throw new RuntimeException("Error in loading ftl template: "+e.getMessage());
    }
}
}l

解决方案是双重的。上下文位置是“web”目录。所以用这个设置freemarker配置,修复了这个问题

    private FreeMarkerConfig(ServletContext context){
    cfg = new Configuration();
    cfg.setServletContextForTemplateLoading(context, "/WEB-INF/classes/templates/");
    }
作为第二个有用的提示,我发现我必须只使用模板的名称而不是文件名来请求模板。i、 e.邀请和非邀请。ftl