Maven资源替换和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模板代码


  Name:
  ${name}


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


  Name:
  My Maven project


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

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


  
    src/main/resources
    true
    
      **/*.ftl
    
  
  
    src/main/resources
    false
    
      **/*.ftl
    
  



你可能感兴趣的:(Maven,FreeMarker)