161213Maven资源替换和Freemarker模板

Posted 目标奔雷手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了161213Maven资源替换和Freemarker模板相关的知识,希望对你有一定的参考价值。

先介绍一下本文的两位主角:

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>My Maven project</td>
</tr>

其中的${name}变量应该是FreeMarker变量,由FreeMarker引擎在运行时刻进行替换, 但${name}同时又是一个Maven预定义的变量, 当进行Maven项目打包时, 该变量会被替换成对应的Maven属性值并写入打包文件中, 最终打包文件中的模板会如下所示。

<tr>
  <td class="label">Name:</td>
  <td>My Maven project</td>
</tr>

  解决方法有两种, 简单的是在FreeMarker模板中,避免使用Maven属性变量名, 比如将${name}替换成${customerName}, 这样Maven就不会修改这个文件了。

更好的方法是在Maven POM文件中声明对FreeMarker模板文件进行直接复制,不要进行任何Maven资源替换。 如下例所示, 这里定义了两个成对的过滤规则, 第一个规则声明不要对FreeMarker模板文件进行资源替换, 第二个规则则声明对FreeMarker模板文件进行直接复制。

<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.ftl</include>
<include>**/*.tpl</include>
</includes>
</resource>

<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.ftl</include>
<include>**/*.tpl</include>
</includes>
</resource>
</resources>

 

注:没有第二个规则的话,FreeMarker模板文件不会被复制到最终的打包文件中。

 

以上是关于161213Maven资源替换和Freemarker模板的主要内容,如果未能解决你的问题,请参考以下文章

maven 打包时动态替换properties资源文件中的配置值

开发常用镜像资源替换为国内开源镜像(yum,compose,maven,docker,android sdk,npm,国内开源镜像汇总)

freemarke字符串常用

请问maven工程jar包,war包,pom打包,都是怎么定的?

Gradle初探:发布项目到Nexus资源库

maven 灵活构建