2014-08-28 54 views
3

請注意:看來我可能在這裏使用*.groovy文件使事情變得複雜,因爲它需要在運行時正確編譯和接線。 基於*.properties的解決方案,我現在更有趣!Grails從類路徑中的文件讀取屬性?

我想補充一個Custom.groovy(或最壞的情況下,custom.properties)文件到我的Grails(2.3.6)應用程序的conf目錄,然後配置Config.groovy在該文件並保存它內部的任何屬性閱讀。

所以:

mygrailsapp/ 
    grails-app/ 
     conf/ 
      BuildConfig.groovy 
      Config.groovy 
      <other stuff> 
      Custom.groovy or custom.properties 

Custom.groovy/custom.properties可能看起來像:

fizz = "buzz" 

,然後裏面Config.groovy

grails.config.locations = [ 
    "classpath:${appName}-config.properties", 
    "classpath:${appName}-config.groovy", 
    "file:${userHome}/.grails/${appName}-config.properties", 
    "file:${userHome}/.grails/${appName}-config.groovy", 
    Custom 
] 

println "The value of fizz is ${fizz}." 

如果這是正常工作,然後當我運行,例如grails run-app,我會看到輸出像:

嘶嘶聲的價值是嗡嗡聲。

相反,我看到:

香味的值是[:]。

這是怎麼回事,我需要做些什麼來解決這個問題?最終,Custom.groovycustom.properties文件可以位於Grails的應用程序內的任何地方(不conf目錄,雖然這將是我的偏好)。唯一重要的是我可以在Config.groovy之外定義變量,並在Grails進入build/run/test/etc時在Config.groovy之內訪問它們。應用程序。

+1

你可以嘗試給你的文件的完整路徑到位置..像 「文件:customConfig.groovy」 – 2014-08-28 11:43:40

+0

謝謝@LalitAgarwal(+1) - 我可以試一試,但在我做之前,我只想確保我理解你的問題。你問我是否可以給**絕對文件路徑**而不是'classpath' URI?如果是這樣,我會傾向於說「* no *」,因爲Grails應用程序可能從機器內的任何位置運行('etc/apps/mygrailsapps','/ home/myuser/foo/bar/mygrailsapp'等)。 – DirtyMikeAndTheBoys 2014-08-28 11:47:35

回答

3

grails.config.locations財產可包括Class對象以及URL字符串,所以

grails.config.locations = [Custom] 

會做你需要什麼 - grails-app/*.groovy文件的應用程序生成時被編譯,生成的.class文件進入WAR(在WEB-INF/classes之下),而不是.groovy文件本身。

如果你想.groovy在你的戰爭結束了(這樣你就可以在生產服務器上進行編輯,而不必每次都重建WAR),那麼你就需要把它放在什麼地方比其他grails-app。你可以嘗試把(.groovy.properties)文件直接導入web-app/WEB-INF/classes,然後應該允許

grails.config.locations=["classpath:Custom.groovy", "classpath:custom.properties"] 

才能正常工作。


編輯:我現在看到的問題 - 你不能指從主Config.groovy內部在外部配置文件中定義的值,因爲過程是Grails的第一次加載和處理Config.groovy,然後提取grails.config.locations從,然後依次加載每個指定的外部文件,然後只有它是否將來自不同文件的值合併在一起以產生最終的grailsApplication.config。如果您想檢查您的外部設備是否對配置做出了正確的貢獻,那麼您必須這樣做,在完成配置加載併合並在一起之後,您必須這樣做oustideConfig.groovy。最簡單的方法可能是在BootStrap中執行一些log.debug語句。

或者可能簡單一些,讓你產生groovy文件中適當的類,而不是ConfigSlurper腳本,所要求的性能static final領域

class LazyBonesConfig { 
    static final VERSION = "1.0" 
    static final APPNAME = "example" 
} 

,然後在Config.groovy你可以參考LazyBonesConfig.VERSION

+0

謝謝@Ian Roberts(+1) - 我已經更新了我的問題,以反映我的'grails.config.locations'屬性的實際值(在我的原始文章中,我只是簡單化了它)。我試過你的建議,把'Config'作爲一個位置,我仍然得到相同的結果。有任何想法嗎?再次感謝! – DirtyMikeAndTheBoys 2014-08-28 11:52:31

+0

作爲一個側面思考,也許我用.groovy文件過度複雜的東西。一個解決方案看起來像是在'custom.properties'文件中讀取的內容?實際上,我只是將簡單的鍵/值對存儲在這個文件中。 – DirtyMikeAndTheBoys 2014-08-28 11:53:32

+1

@Zac你需要刪除「自定義」輪的引號 - 它需要是一個'java.lang.Class'文字,而不是一個給出類名的字符串。 – 2014-08-28 12:05:02