我想構建一個插件模塊,可以使用ServiceLoader
加載。這需要向META-INF/services
目錄中添加一個文件,該文件以服務接口命名,幷包含實現該目錄的類的合格路徑。然後您可以致電ServiceLoader.load()
加載這些服務。META-INF /帶有Gradle的JAR服務
下面是一個例子:
說,我們要提供所謂org.example.plugins.PluginService
一個插件接口。然後,我們在類org.example.plugins.impl.ExamplePlugin
中提供此服務的實現。
如果我們想要某種插件機制,我們可以創建一個包含實現的JAR文件。該JAR文件還必須包含文件META-INF/services/org.example.plugins.PluginService
。此文件必須包含一行
org.example.plugins.impl.ExamplePlugin
使ServiceLoader
能夠找到實施。如果該JAR文件在構建路徑,你可以通過調用
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
這個迭代會給你訪問過由該ServiceLoader
發現所有的插件加載插件。
由於某些原因,默認情況下,Gradle不會將文件包含到META-INF
目錄中。有沒有辦法讓生成的JAR包含這樣的文件?
我已經在類Jar
中找到了方法metaInf
。但我不知道groovy能夠自己找到解決方案。
你確定嗎?對我來說工作得很好。你究竟在哪裏放置這個文件,你的'build.gradle'看起來如何? – axtavt
主要源文件夾「src/main/java」中有一個「META-INF」目錄。構建腳本沒有什麼特別之處。它幾乎是一個標準的,包含一些額外的依賴和一些自定義存儲庫。 – pvorb