0

我有一個jar文件,我想將其放入我的應用程序服務器(WebLogic)的共享庫中。該jar包含一些正在實現接口的類,這些接口位於戰爭部署的內部。部署有一個Spring單例,用於初始化共享jar中包含的類。無法從共享lib文件夾動態加載java類

所以我猜想的是該類無法加載,因爲接口尚未加載(它們在部署中),並且當類加載器嘗試加載該類時,它可能會收到一些編譯錯誤(我不在任何地方都看不到),並且不會加載它,當部署嘗試實例化尚未加載的內容時(共享jar),它會出錯。

所以問題是我在這裏做什麼?我如何配置所有這些工作?我真的不想複製包含共享文件夾中所有接口的jar。 (它需要是一個整體.war文件)。

謝謝。

P.S.不幸的是,我沒有任何錯誤/異常,而類加載域lib(共享)文件夾。當我嘗試實例化它時,我只有java.lang.NoClassDefFoundError

+0

我不認爲你有選擇。將接口移動到lib目錄。至少嘗試一下,看看它是否有效。你爲什麼在共享庫中的實現而不是接口? –

+0

我已經嘗試過了,事實上這就是我最初實現它的原因,但工作中的人不會分開戰爭檔案,他們說所有東西都應該在一個可交付物中。我正在嘗試.ear現在,使用APP-INF/lib文件夾,如果它起作用,我會在這裏更新提要。同樣關於實現 - 這些是客戶實現,並且是可選的;這不是我們作爲產品的可交付成果。 – nisenish

回答

1

我不認爲你想使用共享lib目錄。這聽起來像你想要將一個客戶的jar添加到單個war的classpath中,而不需要他們修改war或者擁有多個可交付成果。我看到兩種方式。兩者都需要直接指向本地文件系統,這在webapps中通常是一個壞主意。我認爲這可能是可以的,因爲你指向可選的客戶提供的類。總而言之,這種可擴展性機制可以從webapp之外改變。但這意味着客戶必須手動在所有系統上以相同的方式部署該jar。這可能是集羣中的一個麻煩,它顯然需要直接訪問應用服務器的文件系統。

  1. 我不記得,如果這個工程,但你應該能夠把一個罐子在webapp的WEB-INF/lib中有META-INF/MANIFEST.MF其類路徑外戰點。這將是一個已知的硬編碼位置。它可以是相對於當前工作目錄的相對路徑。這通常是應用程序服務器的主目錄或您的域的主目錄。

  2. 構建您自己的ClassLoader實例。它應該可能是一個URLClassLoader,所以你可以讓你的客戶提供一個目錄或一個jar文件。將這個classloader的父母設置爲webapp的類加載器。它可以指向運行時確定的位置。這裏的問題是在所有正確的地方使用這個類加載器。我不知道任何通用的方法,所以我會推薦第一個選項。

+0

哇,它的工作!非常感謝!它使用相對URL,但不是絕對的,我仍然嘗試。 – nisenish