1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
服務(wù)提供者的定位方式取決于服務(wù)提供者是否位于類路徑或模塊路徑上。這在以下文檔中進(jìn)行了描述ServiceLoader
:
將服務(wù)提供者部署為模塊
在模塊中開發(fā)的服務(wù)提供者必須在模塊聲明中的provided指令中指定。Provides 指令指定了服務(wù)和服務(wù)提供者;當(dāng)另一個(gè)帶有該服務(wù)的use指令的模塊獲取該服務(wù)的服務(wù)加載器時(shí),這有助于定位提供者。強(qiáng)烈建議模塊不要導(dǎo)出包含服務(wù)提供者的包。不支持模塊在提供指令中指定另一個(gè)模塊中的服務(wù)提供者。
[...]
在類路徑上部署服務(wù)提供者
打包為類路徑的 JAR 文件的服務(wù)提供者通過將提供者配置文件放置在資源目錄中來標(biāo)識
META-INF/services
。提供程序配置文件的名稱是服務(wù)的完全限定二進(jìn)制名稱。提供者配置文件包含服務(wù)提供者的完全限定二進(jìn)制名稱列表,每行一個(gè)。[...]
基本上,如果您希望能夠加載服務(wù)提供程序,無論它是否放置在類路徑或模塊路徑上,您都需要在文件中指定指令并provides
在.?您還必須確保使用正確的方法來加載服務(wù)提供者:module-info.java
META-INF/services
ServiceLoader#load(Class,ClassLoader)
在命名模塊(即模塊路徑)和未命名模塊(即類路徑)中定位提供程序。
ServiceLoader#load(ModuleLayer,Class)
僅在命名模塊(即模塊路徑)中定位提供程序。
添加回答
舉報(bào)