You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Liferay Portlet的Maven项目中导入其他项目的FTL资源?

Liferay 6.2 Maven依赖项目中FTL资源访问与Freemarker配置方案

1. 访问Maven依赖项目内的资源(FTL、图片等)

依赖项目打包为jar后,资源需放在src/main/resources/META-INF/resources/目录下(Maven会自动将该目录下的资源打入jar包),通过类加载器即可读取:

  • 读取FTL文件流:
    InputStream ftlStream = Thread.currentThread().getContextClassLoader()
        .getResourceAsStream("META-INF/resources/templates/common.ftl");
    
  • 获取图片资源URL:
    URL imageUrl = Thread.currentThread().getContextClassLoader()
        .getResource("META-INF/resources/images/logo.png");
    

注意:不要用this.getClass().getResource(),因为Portlet的类加载器和依赖jar的类加载器可能存在层级差异,用线程上下文类加载器更可靠。

2. 配置Freemarker定位依赖中的FTL文件

核心是给Freemarker配置类加载器模板加载器,让它能从依赖jar中读取FTL:

方式一:自定义Freemarker Configuration

如果是自己初始化Freemarker配置,直接指定模板加载器:

// 对应Liferay 6.2内置的Freemarker版本(通常是2.3.23)
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
// 设置依赖项目中FTL的根路径(对应依赖里的src/main/resources/META-INF/resources/templates/)
cfg.setTemplateLoader(new ClassTemplateLoader(
    Thread.currentThread().getContextClassLoader(),
    "META-INF/resources/templates/"
));
// 直接通过文件名获取模板
Template template = cfg.getTemplate("common.ftl");

方式二:扩展Liferay内置的Freemarker配置

如果使用Portlet自带的Freemarker环境,在Portlet的init()方法中扩展现有配置:

@Override
public void init() throws PortletException {
    super.init();
    // 获取Liferay内置的Freemarker配置
    FreeMarkerConfig freeMarkerConfig = (FreeMarkerConfig) getPortletContext()
        .getAttribute(FreeMarkerConfig.FREEMARKER_CONFIG);
    Configuration cfg = freeMarkerConfig.getConfiguration();
    // 将类加载器加载器添加到现有加载器链中,保留原有Portlet内的FTL加载能力
    cfg.setTemplateLoader(new MultiTemplateLoader(new TemplateLoader[] {
        cfg.getTemplateLoader(),
        new ClassTemplateLoader(Thread.currentThread().getContextClassLoader(), "META-INF/resources/templates/")
    }));
}

思路验证与临时方案优化

你的思路是正确的:先确保资源能被类加载器访问,再配置Freemarker的模板加载路径。
如果坚持使用外部FTL路径的临时方案,可通过FileTemplateLoader实现,但需注意:

// 指定外部FTL目录
cfg.setTemplateLoader(new FileTemplateLoader(new File("/opt/liferay/ftls")));

该方案需保证服务器上存在指定目录,且部署时同步FTL文件,维护成本高于类加载器方式,不推荐。

内容的提问来源于stack exchange,提问作者SolS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:10:24