繁体   English   中英

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

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

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

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

最小的例子(arg0 是未定义的,因此这总是适用于 else 情况):

#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的原始输出打印到我的调试日志中,结果在运行template.merge(context,sw)之后肯定有一个新行,这意味着它即将到来从速度。

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

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

这并不能解释为什么它在使用相同的默认值运行相同的速度版本时表现不同,因此可能涉及更深层次的问题,但这解决了直接的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM