先介绍一下本文的两位主角:
Apache Maven - 正当红的项目管理工具
FreeMarker - 老牌的模板引擎
两者貌似互不相干,何来冲突呢?
原来Maven有一个内置的资源替换机制, 可以对由Maven管理的资源文件进行变量替换。 预定义的Maven属性变量包括${name},${project.version},${project.packaging}和${project.artifactId}等。 熟悉FreeMarker的同学就会发现Maven使用和FreeMarker相同的方法来定义变量:${变量名}。
如果把FreeMarker模板文件放在Maven资源文件目录下(比如src/main/resources), 在缺省配置下, Maven打包工具会扫描这些FreeMarker模板文件并替换其中所有Maven可识别的变量。
举例而言, 有以下FreeMarker模板代码
<tr>
<td class="label">Name:</td>
<td>${name}</td>
</tr>
其中的 ${name}变量应该是FreeMarker变量,由FreeMarker引擎在运行时刻进行替换, 但 ${name}同时又是一个Maven预定义的变量, 当进行Maven项目打包时, 该变量会被替换成对应的Maven属性值并写入打包文件中, 最终打包文件中的模板会如下所示。