2012-12-17 11 views
5

我有一個grails應用程序,我通過grails交互模式運行。這個應用程序包含服務,tagLibs,GSPS等,但最重要的是它包含在src/groovy文件夾中的groovy文件。Grails交互模式中的靜態字符串

其中一個常規文件被稱爲AppConstants.groovy,幷包含靜態變量的大量即

public static final String VARIABLE1 = "VARIABLE VALUE" 

當在非交互模式下,我得到沒有問題運行這個,這個變量所做的任何更新反映在正在運行的應用程序下一次部署時。然而,在交互模式下,即使您撥打exitrun-app,也不會在應用中反映對VARIABLE1變量所做的任何更改。要反映的變化必須退出並重新啓動交互模式。

起初我以爲這可能是一個緩存問題,我的靜態最終變量被緩存,並且由於JVM沒有被重新啓動,所以這個緩存永遠不會被更新。然而,我注意到在添加一個新的變量之前,在應用程序之前從未存在過的變量在我的應用程序的其餘部分中不可用,直到重新啓動交互模式爲止。

任何想法背後的原因是什麼?該類正在編譯,因爲我可以在交互式控制檯中看到這一點,所以可以預期任何更改都會反映到應用程序中,而不一定在運行時,但至少在exit後跟run-app

額外的信息:Grails的2.1.0版本

+0

也許交互模式無法看到文件已更改?如果你只是運行應用程序,出現消息「編譯1源文件」? –

+0

是的,正如我所提到的,它編譯文件,我可以在交互模式下看到它,但即使在重新編譯,停止和運行應用程序後,即使在清理後仍然無法識別編輯或添加靜態最終字符串直到交互模式完全重啓之後。 –

回答

1

做了一個小測試,這裏是我發現:

  1. 啓動過程中沒有-reloading決不允許變量進行更新 - 所以開始爲grails -reloadinggrails -reloading run-app

  2. final變量在啓動過程中,如上所述。所以public static String VARIABLE1 = "VARIABLE VALUE"沒有重新加載並顯示當我更新值

  3. final變量將不會重新加載。所以public static final String VARIABLE1 = "VARIABLE VALUE"不會重新加載並顯示新的值。

我甚至創建了幾個變量,一些final和一些沒有。只要我使用-reloadingfinal變量將重新加載,但final不會。更新並保存時VARIABLE2變化 -

public static final String VARIABLE1 = "VARIABLE VALUE" 
public static String VARIABLE2 = "NON FINAL VARIABLE VALUE" 

在這種情況下VARIABLE1將不會改變,直到重新啓動。

+0

感謝您的信息,我會等待一段時間,看看是否有其他人有任何輸入,以及最終變量的可能解決方案。 –