簡體   English   中英

如何在運行時動態加載來自不同項目的類和庫

[英]How to dynamically load classes and libraries from different project in runtime

我將解決方案分為2個項目:

  • 獨立項目包含接口ExampleInf並聲明該應用程序所需的一些服務。 這些服務由第三方API( Hadoop客戶端API)提供。 該項目包含GUI組件和其他應用程序邏輯,但不鏈接提供ExampleInf聲明的服務的第三方庫。 該項目中沒有實現ExampleInf類。
  • 包含到第三方庫的鏈接的從屬項目。 該項目包含類ExampleImpl ,該類封裝了第三方API並實現了ExampleInf

獨立項目中,存在使用(使用) ExampleInf聲明的服務的類(我們稱其為A類)。 因為獨立程序不鏈接從屬項目,所以為了使用ExampleInf它需要在運行時動態加載其實現ExampleImpl 它還需要動態加載ExampleImpl所需的所有第三方庫。

當前,這是通過一堆常量( public static final String屬性)完成的,這些常量包含指向動態加載資源所在的依賴項目的路徑以及許多混亂的ClassLoader代碼。 我認為這不是一個好的解決方案。 是否有任何模式,最佳實踐或通用方法可以做到這一點? 您會根據自己的經驗推薦什么?

這種模式讓我想起了Java EE中的依賴注入。 至少我認為,最好將需要動態加載到XML的類和庫(.jar-s)的位置外部化,然后將它們全部循環加載,而不是為每個常量單獨調用ClassLoader.loadClass 有什么不錯的干凈方法如何在同一包中加載XML並加載該XML指定的類和jar? 代碼示例將不勝感激。

您可以使用ServiceLoader實用程序執行此操作(這是加載了許多jdk服務,例如xml庫和現代的jdbc驅動程序庫)。 如果從屬項目在啟動時是類路徑的一部分,那么您可以繼續進行(假設它已正確設置)。 否則,您將需要在嵌套的類加載器中加載相關項目,並將其傳遞給load(Class,ClassLoader)方法(或在調用load(Class)之前將類加載器設置為當前上下文類加載器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM