简单ServiceLoader - java.util.ServiceConfigurationError ...找不到提供程序

时间:2018-03-01 13:09:41

标签: java serviceloader

我正在尝试使用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

OR(同一目录中的两个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)

无法弄清楚提供程序类是如何定位的。请帮忙!

提前致谢。

1 个答案:

答案 0 :(得分:0)

[这是来自艾伦·贝特曼的]

对于初学者,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 

...应该工作。