我正在使用 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)之后肯定有一個新行,這意味著它即將到來從速度。
uj5u.com熱心網友回復:
我發現標準化兩種安裝輸出的方法是將以下行添加到我的 Velocity 呼叫代碼中:
Velocity.setProperty("space.gobbling", "bc");
這并不能解釋為什么它在使用相同的默認值運行相同的速度版本時表現不同,因此可能涉及更深層次的問題,但這解決了直接的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482060.html
