我正在使用apache velocity从一个使用用户定义模板的tomcat web应用程序中生成rtf输出,这个web应用程序的依赖项由maven管理,velocity 2.3定义在pom中。
在修改我的一个模板时,我发现我可以使用多行注解(#* *#)来“缩进”模板,使其更具可读性。我有一个在Windows上运行的本地版本的Web应用程序,用于测试目的,我不断上传我的模板,因为我做了修改,以确保这不会破坏功能,它的工作如预期。然而,当我把它上传到生产版本时,输出中有大量的新行,我在那里添加了注解。我还检查了模板文件的编码(就我所知,在所有阶段都是UTF-8)。
最小示例(arg 0未定义,因此始终为else情况):
#if ($arg0 && $arg0.equals("top"))
#***##set ($IDAlignment = "top")
#else
#***##set ($IDAlignment = "left")
#end
$IDAlignment
我的应用程序的生产版本生成以下内容:
left
本地版本:
left
删除第二个“缩进”会删除输出中多余的新行,而第一个缩进对任何一个都没有影响(我假设是因为速度永远不会到达那个分支)。同样,在行尾添加一个附加注解会删除额外的新行(#***##set ($IDAlignment = "left")##
)。
如上所述,我的应用程序的依赖项由Maven控制,因此它们应该运行相同版本的Velocity,但是在更远的地方,环境不同--例如,tomcat版本不完全匹配,java环境也不完全匹配。这会产生不同吗?我很困惑,也有点担心这些东西会改变Velocity阅读模板的方式,除非我错过了一些重要的东西。
编辑:我在两个版本上都将tomcat更新到了9.0.62,新行仍然出现在“生产”(现在是原始容器的测试克隆)上,但不在本地上。一个同事在WSL的linux文件系统端运行他的本地版本也没有额外的新行问题。
编辑2:我清除了服务器的maven缓存,这也没有效果。
换行字符的行为与我最初认为的稍有不同,但我不认为这是问题所在。模板文件在本地和服务器上都有行尾,\r\n服务器的输出反映了这一点。如果我将其更改为只有\n行尾,则会出现相同的问题,只是将输出中额外换行符的定义更改为\n,这正是我对模板中合法换行符的期望。
问题似乎是velocity在#指令后丢弃换行符(任何类型)。如果我将模板的第四行编辑为#***##set ($IDAlignment = "left")#end
,这个问题也会消失。如果不缩进,任何#集合后的新行都会被忽略,但是,如果缩进,由于某种原因,它们在我的服务器副本上不再转义,但在我的本地副本上不会。
编辑3:我绕过了tomcat/apache/browser对导出的处理,只是将velocity的原始输出打印到我的调试日志中,结果肯定是在运行template.merge(context,sw)后立即出现了一个新行,这意味着它来自velocity。
1条答案
按热度按时间8cdiaqws1#
我发现标准化这两个安装的输出的方法是在Velocity调用代码中添加以下行:
Velocity.setProperty("space.gobbling", "bc");
这并不能解释 * 为什么 * 在运行具有相同默认值的相同Velocity版本时会出现不同的行为,因此可能涉及更深层次的问题,但这解决了眼前的问题。