簡體   English   中英

如何使外部庫的Java serviceLoader工作

[英]How to make Java serviceLoader of a external library work

我正在為第3方軟件開發一個插件,該插件尚未公開。 對於插件,我使用的是由maven管理的外部lib(.jar),稍后在雄貓服務器上執行。 在我更新到該庫的最新版本之前,一切工作都很好,該庫現在使用java.util.serviceLoader來加載接口的具體實現。 構建時,我的項目在tomcat服務器上具有以下包結構:

mypluginPackage.jar
|
---META-INF
---lib
   |
   --- theExternalLibUsingServiceLoader.jar
      |
      ---META-INF
         |
         ---services
            |
            --- full.path.to.TheFactoryInterface
      ---external.lib.path
         |
         --- TheFactoryInterface.class
         --- TheConreteClass.class
   --- mypluginCore.jar
      |
      ---META-INF
      --- my.plugin.path
         |
         --- MyClassUsingTheExternalLib.class

如您所見,外部庫具有正確的服務條目,這對於serviceLoader在META-INF中查找接口的具體內容是必需的。 full.path.to.TheFactoryInterface文件的內容是full.path.to.TheConcreteClass ,這似乎是合法的。

我的插件(軟件包和內核)卻沒有任何這些META-INF信息。

現在發生的事情是,每當我的插件使用觸發外部庫的serviceLoader的方法時,serviceLoader都無法找到具體的實現。

我已經嘗試過將完全相同的services/full.path.to.TheFactoryInterface到我所有的META-INF目錄中,這是行不通的(我想我需要更改full.path.to.TheFactoryInterface文件的內容但我不確定-由於第三方軟件的插件結構未記錄-正確的(相對)路徑是什么樣的)。

誰能給我一個鏡頭,我在這里做錯了什么以及如何解決它,以便serviceLoader找到具體的類? 服務文件夾及其內容應放置在哪個META-INF文件夾中,我應該更改路徑嗎? 那是根本的錯誤,還是我錯過了完全不同的東西?

我知道這是一個非常特殊的主題,因為第3方軟件尚不為人所知,但是依賴於ServiceLoader的任何信息以及在具有多個META-INF文件夾的多個jar上以及在不同的執行上下文/類路徑中運行時的行為,將不勝感激。

我可以通過擴展外部庫使它正常工作,因此我可以提供一個自定義的ClassLoader。 原來,默認的ClassLoader是錯誤的。

另外,我還能夠與第三方工具開發人員取得聯系並獲得所需的信息-稱之為“社交反編譯”。

現在一切正常。

暫無
暫無

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

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