2014-03-28 84 views
4

我是Play框架& SBT新手。在Play類路徑中添加外部文件夾

在我的Play for Java項目中,在其中一個類中,我需要使用ResourceBundle.getBundle()在我的Play應用程序之外讀取屬性文件。

我已經能夠做到這一點在「播放控制檯」模式加入我的build.sbt以下 unmanagedClasspath在運行系統+ =文件(「/ mybundle」)

當我需要運行應用程序在「生產」模式中, 我試圖做dist,然後解壓縮壓縮文件,然後進入「bin」,然後在bin文件夾中運行生成的shell腳本。

我發現我的班級沒有閱讀該軟件包。 (這在「Play Console」模式下很好)。 後來我注意到,在生成的shell腳本來運行遊戲,有以下

declare -r app_classpath="$lib_dir/com.foo.abc-web-1.0-SNAPSHOT.jar:$lib_dir/com.foo.abc-common-1.0-SNAPSHOT.jar 

我修改行添加我的文件夾,以便它會成爲

declare -r app_classpath="/mybundle:$lib_dir/com.foo.simpleproject-web-1.0-SNAPSHOT.jar:$lib_dir/com.foo.abc-common-1.0-SNAPSHOT.jar 

然後重新啓動我的戲應用程序使用shell腳本,我的應用程序可以正確讀取該包。

但是,上述工作必須手動完成,我想將其外部化。

我想解決的是以下幾點: 1.有什麼辦法讓我在build.sbt中指定的bundle文件夾可以在play dist中重用嗎?

  1. 或者,如果以上是不可能的,玩DIST期間,有沒有什麼辦法來指定,所以我的文件夾(即「/ mybundle」)將如上加入app_classpath?

  2. 有沒有什麼辦法可以在我的build.sbt中的「Play控制檯」模式中將文件夾外化?

BTW我也試圖調用腳本文件,即 ./simpleproject -classpath「/ mybundle」 但它產生「壞的應用程序路徑:-cp」當追加-classpath錯誤。 同樣的情況下,我用-cp替換-classpath。

任何人都可以在上面提供建議嗎?先進的謝謝你。

回答

1

在配送中是否包含他們的選項?如果是這樣,只是這樣做:

unmanagedResourceDirectories in Compile += file("/mybundle") 

除此之外,沒有,SBT原生打包,生成啓動腳本,不給你這種靈活性。但是你可以編寫你自己的啓動腳本,將它放在你的項目中的dist/bin/my-start-script.sh中,並且它會在發行版的bin目錄中結束,然後你就可以使用它。確保類路徑正確的一種簡單方法是使用通配符類路徑,即:

libdir=... 
java -classpath "/mybundle:$libdir/*" ... 
+1

碰巧在我的情況下,分發捆綁文件不是一個選項。 軟件包文件將由SCM管理,根據環境的不同,文件夾路徑也會不同。 由於要求對所有env使用相同的分配,因此我發現是否可以將該分發包的文件夾路徑外部化。 謝謝你的幫助,詹姆斯。 – Simon2014

+1

對於我在Compile + = file(「/ mybundle」)中添加非託管資源目錄沒有解決問題 /mybundle沒有顯示在app_classpath =「...」 老實說,這是一個非常令人沮喪的事情,這樣一個簡單的任務是在這樣一個巨大的痛苦中。 sbt中有半打classpath設置,它們都沒有幫助 –

0

添加到生成的行。SBT:

scriptClasspath in bashScriptDefines ~= (cp => "../../mybundle" +: cp) 

將導致

declare -r app_classpath="$lib_dir/../../mybundle:$lib_dir/../conf/:etc... 

在啓動腳本。所以可以在應用程序類路徑中添加相對路徑條目。

相關問題