来自生产 (ubuntu) 和本地 (windows) 的 Apache Velocity 输出之间的不一致

Inconsistencies between Apache Velocity output from production (ubuntu) and local (windows)

我正在使用 apache velocity 从使用用户定义模板的 tomcat 网络应用程序生成 rtf 输出。 webapp 的依赖项由 maven 管理,pom 中定义了 velocity 2.3。

在修改我的一个模板时,我发现我可以使用多行注释 (#* *#) 来“缩进”模板,使其更具可读性。我在 windows 上有一个本地版本的 webapp 运行 用于测试目的,我在进行更改时不断将我的模板上传到该版本以确保这不会破坏功能,并且它按预期工作。然而,当我将它上传到生产版本时,输出中有大量新行,我在其中添加了评论。我还检查了模板文件的编码(据我所知,所有阶段都是 UTF-8)。

最小示例(arg0 未定义,因此这总是转到其他情况):

#if ($arg0 && $arg0.equals("top"))
#***##set ($IDAlignment = "top")
#else
#***##set ($IDAlignment = "left")
#end
$IDAlignment

我的应用程序的生产版本生成以下内容:


left

本地版本:

left

删除第二个“缩进”会删除输出中多余的新行,第一个对任何一种方式都没有影响(我假设是因为速度永远不会到达那个分支)。同样,在行尾添加附加注释会删除额外的新行 (#***##set ($IDAlignment = "left")##).

如前所述,我的应用程序的依赖项由 maven 控制,因此它们应该是 运行 相同版本的速度,但是除了环境不同之外 - 例如tomcat 版本不完全匹配,java 环境也不完全匹配。这会有所作为吗?我很困惑,有点担心这会如何改变速度读取我的模板的方式,除非我遗漏了一些巨大的东西。

编辑:我将两个版本的 tomcat 更新为 9.0.62,新行仍在“生产”(现在是原始容器的测试克隆)上出现,但不在本地出现。一位同事 运行 他的 WSL linux 文件系统端的本地版本也没有额外的换行问题。

编辑 2:我清除了服务器的 Maven 缓存,但也没有效果。

换行符的行为与我原先想象的略有不同,但我认为这不是问题所在。模板文件在本地和服务器上都有 \r\n 行结尾,服务器的输出反映了这一点。如果我确实将其更改为只有 \n,它会遇到同样的问题,只需将输出中额外换行符的定义更改为 \n,这是我对模板中合法换行符的期望。

问题似乎在于 velocity 在 # 指令后丢弃换行符(任一类型)。如果我将模板的第四行编辑为 #***##set ($IDAlignment = "left")#end ,问题也会消失。如果没有缩进,#set 后的任何新行都将被忽略,但是,由于某种原因,缩进后它们不再在我的服务器副本上转义,但在我的本地副本上不会转义。

编辑 3:我绕过 tomcat/apache/browser 导出处理,只是将 velocity 的原始输出打印到我的调试日志中,结果肯定在 运行 [=43= 之后立即有一个新行](context, sw),这意味着它来自速度。

我发现标准化这两个安装的输出的方法是将以下行添加到我的 Velocity 调用代码中:

Velocity.setProperty("space.gobbling", "bc");

这并不能解释为什么它的行为不同而运行具有相同默认值的相同速度版本因此可能涉及更深层次的问题,但是这解决了眼前的问题。