【问题标题】:No measurement ServiceProvider found未找到测量服务提供者
【发布时间】:2017-09-20 20:24:30
【问题描述】:

我正在研究计量单位开源库,我使用的maven依赖是:

<dependency>
  <groupId>tec.units</groupId>
  <artifactId>unit-ri</artifactId>
  <version>1.0.2</version>
</dependency>  

它实现了 JSR-363。当我尝试如下使用它时:

ServiceProvider provider = ServiceProvider.current();

结果是:

Exception in thread "main" java.lang.IllegalStateException: No measurement ServiceProvider found.

谁能告诉我怎么回事?

【问题讨论】:

  • 我不知道框架,但是你不应该自己设置ServiceProvider吗? ServiceProvider.available() 返回什么?从unitsofmeasurement.github.io/unit-api/site/apidocs/javax/… 读取 current() 将在没有当前 Provider 时抛出 IllegalStateException。
  • 正如我在 :link 中看到的,它只是调用 ServiceProvider.current().getUnitFormatService().getUnitFormat() 并且代码工作正常,当我调试代码时,它似乎将使用 ServiceLoader.load(ServiceProvider.class) 来加载 ServiceProvider 本身。
  • 能否请您分享错误堆栈跟踪
  • @Saurabh,它是这样的:线程“main”java.lang.IllegalStateException中的异常:未找到测量ServiceProvider。在 javax.measure.spi.ServiceProvider.current(ServiceProvider.java:157) 在 UnitOfMeasure.com.sap.kfp.App.main(App.java:18)
  • 是错误的开始......还是唯一的错误

标签: java units-of-measurement


【解决方案1】:

在 Netbeans IDE 中打开 bean 时,我在使用 java bean 表单中的度量库时遇到了同样的问题。这个技巧对我有用:

import javax.measure.spi.ServiceProvider;
import tec.units.ri.spi.DefaultServiceProvider;        

private ServiceProvider serviceProvider;    
try {
   serviceProvider = ServiceProvider.current();
} catch ( IllegalStateException e ) {
   serviceProvider = new DefaultServiceProvider();
}

【讨论】:

    【解决方案2】:

    所以,我查看了 ServiceProvider 类,看看 current() 方法做了什么:

    https://github.com/unitsofmeasurement/unit-api/blob/master/src/main/java/javax/measure/spi/ServiceProvider.java

    您可以看到它使用 ServiceLoader 来返回一个值。如果您查看 ServiceLoader 的文档,您会发现您需要一个配置文件:

    https://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

    通过在资源目录 META-INF/services 中放置一个提供者配置文件来识别服务提供者。该文件的名称是服务类型的完全限定二进制名称。该文件包含具体提供程序类的完全限定二进制名称列表,每行一个。每个名称周围的空格和制表符以及空白行将被忽略。注释字符为'#'('\u0023', NUMBER SIGN);在每一行中,第一个注释字符之后的所有字符都将被忽略。该文件必须以 UTF-8 编码。

    【讨论】:

    • 是的,我可以说我没有正确使用 ServiceProvider。感谢您的指导。
    • 没问题。有关配置文件的示例,请参阅stackoverflow.com/questions/3420715/…
    • 顺便说一下,我认为你使用ServiceProvider很好,只是需要配置的ServiceLoader。
    【解决方案3】:

    适用于可能需要使用此库的每个人。这很奇怪,但是在我将 maven 依赖版本从 1.02 更改为 1.01 之后,没有其他更改,它工作正常。所以,这应该是这个版本的bug...

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2015-10-31
      • 2018-11-10
      • 1970-01-01
      • 2015-09-12
      • 2016-01-02
      • 1970-01-01
      • 2016-10-06
      • 2021-03-24
      相关资源
      最近更新 更多