从 FreeMarker 中的模板字符串中获取所有依赖项名称甚至是多级继承的列表

问题描述

我试图在个人 Maven 项目中使用 FreeMarker 模板引擎。

我想问一下 FreeMarker 是否有一个公共方法,如果将模板主体作为字符串,它可以返回所有依赖模板名称的列表(使用 #import 和 #include 指令)。

如果是这样,能否请您指出代码库中与此相关的正确部分? 即使没有这样的公共方法,能否请您指出实现此目的的私有方法

我不确定是否有办法在 FreeMarker 中以任何方式更改指令的名称(例如 bash 中的别名?或者 C++ 中的“使用”声明,或者 FreeMarker 中的任何用户定义指令)。 如果有,编写这样一个简单的解析器可能会有错误,因为如果它没有找到 <#import><#include> 指令,我们将不会得到依赖模板名称,如别名或用户定义的指令。>

那么有什么我需要特别注意的事情吗?或者我可以使用 String.indexOf()String.substring() 方法编写自己的简单解析器吗?

谢谢!

解决方法

FreeMarker 在运行时几乎可以做所有事情(除了基本解析),包括 #include-s 和 #imports 的解析。因此,您可以拥有 <#include someVariable><#if condition><#include "this.ftl"></#if> 等内容。因此,通常无法确定模板具有哪些依赖项,因此也没有专用 API。有一个未发布的 API 来遍历 AST(从 Template.getRootTreeNode() 开始),然后您可以尝试猜测,希望您的模板在这方面不会很棘手。 (是的,它是 @deprecated,但没关系,在这一点上,它肯定不会从 2.x 中删除。)

关于别名。宏、函数、方法都只是模板语言的值。因此,您可以执行 <#assign mm = myImport.MyMacro>,然后像使用 mm 一样使用 myImport.MyMacro

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...