如何在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
相关产品推荐
相关产品推荐

