首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的ServiceLoader - java.util.ServiceConfigurationError ...提供商...未找到

简单的ServiceLoader - java.util.ServiceConfigurationError ...提供商...未找到
EN

Stack Overflow用户
提问于 2018-03-01 21:09:41
回答 1查看 3.3K关注 0票数 3

我正在尝试使用ServiceLoader运行示例应用程序。为此,我创建了两个JAR:

代码语言:javascript
运行
复制
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.mf具有Main-Class: ok.main.App条目

并且ok.main.App加载ok.service.NumberService的提供程序

代码语言:javascript
运行
复制
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的实现

当命令以以下身份运行时:

代码语言:javascript
运行
复制
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都在同一个目录中)

代码语言:javascript
运行
复制
java -jar number-service.jar

找不到提供程序。

代码语言:javascript
运行
复制
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)

无法弄清楚如何找不到provider类。请帮帮我!

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-11-08 07:49:07

这是艾伦·贝特曼写的

对于初学者,META-INF/services/ok.service.NumberService应该与服务提供者实现一起位于JAR文件中(在本例中为number- service -impl.jar)。下一步是在类路径上同时需要number-service.jar和number-service-impl.jar。

你会发现

代码语言:javascript
运行
复制
java -cp number-service.jar:number-service-impl.jar ok.main.App 

...should工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49050419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档