簡體   English   中英

簡單ServiceLoader - java.util.ServiceConfigurationError ...找不到提供程序

[英]Simple ServiceLoader - java.util.ServiceConfigurationError … Provider … not found

我正在嘗試使用ServiceLoader運行示例應用程序。 為此,我創建了兩個JAR:

JAR 1) number-service.jar
  META-INF/
  META-INF/MANIFEST.MF
  ok/
  ok/service/
  ok/service/NumberService.class
  ok/main/
  ok/main/App.class
  META-INF/services/
  META-INF/services/ok.service.NumberService

META-INF/services/ok.service.NumberService有單行: ok.service.impl.NumberServiceImpl

META-INF/MANIFEST.mfMain-Class: ok.main.App條目

ok.main.App加載的供應商ok.service.NumberService

JAR 2) number-service-impl.jar
  META-INF/
  META-INF/MANIFEST.MF
  ok/
  ok/service/
  ok/service/impl/
  ok/service/impl/NumberServiceImpl.class

包含ok.service.NumberService實現

命令運行時:

java -cp lib/number-service-impl.jar -jar lib/number-service.jar
java -cp ".:lib/number-service-impl.jar" -jar lib/number-service.jar

或(同一目錄中的兩個JAR)

java -jar number-service.jar

找不到提供者。

Exception in thread "main" java.util.ServiceConfigurationError: ok.service.NumberService: Provider ok.service.impl.NumberServiceImpl not found
    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:588)
    at java.base/java.util.ServiceLoader.access$200(ServiceLoader.java:390)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1206)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1215)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1259)
    at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1294)
    at java.base/java.util.ServiceLoader$ProviderSpliterator.tryAdvance(ServiceLoader.java:1478)
    at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:326)
    at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:591)
    at ok.main.App.main(App.java:9)

無法弄清楚提供程序類是如何定位的。 請幫忙!

提前致謝。

[這是來自Alan Bateman]

對於初學者, META-INF/services/ok.service.NumberService應該在服務提供者實現的JAR文件中(在本例中為number-service-impl.jar)。 接下來是在類路徑上需要number-service.jar和number-service-impl.jar。

你會發現的

java -cp number-service.jar:number-service-impl.jar ok.main.App 

...應該管用。

暫無
暫無

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

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