2013-12-24 48 views
0

我有兩個Play 2.2.1應用程序,X和Y.這兩個應用程序在默認包中都有一個Global對象,用於擴展GlobalSettings並覆蓋onStart。 Application X發佈在maven倉庫中,應用程序Y將X作爲依賴項。當試圖運行應用程序Y時,我在onStart期間不斷收到奇怪的異常。這些異常是由應用程序X的onStart函數中的代碼引發的。我沒有收到任何編譯時錯誤或警告。Play應用程序全局設置的混合

這是預期嗎?這是一個特定於Play的問題,還是會在默認包中的任何時間名稱發生衝突?如何防止應用程序的GlobalSettings混合在一起?

我最初把通用代碼放到它自己的項目中,這兩個Play應用程序共享爲一個依賴項。這很煩人,所有的共享代碼真的屬於應用程序X,所以我重組了。

回答

1

您看到的錯誤源於您的類加載器中有多個Global對象,以及哪個對象未加載。類加載器就像一個文件系統,你只能在一個給定的目錄中有一個給定名字的文件。如果您的類路徑中有兩個庫定義了同一目錄中具有相同名稱的文件,則它們不會合並,而是一個覆蓋另一個,並且使用哪個庫取決於類加載器實現 - 在Play中,我們特別不會定義排序。

Global對象必須只有由最終應用程序定義。任何旨在作爲依賴消耗的項目都不得定義Global對象。它應該定義一個可以被Global對象使用的行爲。如果想要透明的插件在啓動的行爲,考慮實施Plugin接口代替,如下記載:

http://developer.vz.net/2012/03/16/writing-a-play-2-0-module/

+0

感謝解釋爲什麼發生這種情況。對我來說有意義的是,我們必須重寫另一個,但我很驚訝它默默地發生。在我的情況下,這兩個應用程序實際上都是相互通信的最終應用程序。我想在兩個應用程序之間重用一些模型代碼(例如序列化/反序列化代碼)。 – mushroom

+0

好吧,聽起來好像它並沒有失敗那樣靜靜地:)但是類路徑上的重複確實會失敗,因爲這是Java的URL類加載器的工作方式,具有相同文件的兩個JAR不會觸發錯誤。如果您想重複使用模型代碼,請將該代碼抽取到兩個應用程序依賴的第三個項目中。 –

相關問題