【问题标题】:ServiceLoader and META-INF/services generator between different modules in maven?Maven中不同模块之间的ServiceLoader和META-INF/服务生成器?
【发布时间】:2017-11-04 20:02:19
【问题描述】:

我想在 Maven 项目中的不同模块之间使用服务 ServiceLoader。我有一个名为 iMage 的父模块。在父模块中有一个名为 jmjrst.main 的模块,它有一个名为“JmjrstPlugin”的公共抽象类。

还有一个名为 prizm-plugin 的模块,它具有以下类: 公共类 HelloWorldPlugin 扩展了 JmjrstPlugin{ ... }。我还添加了 jmjrst.main 作为对 prizm-plugin 和 vica-versa 的依赖项。

为了使用 ServiceLoader,我想使用 META-INF/services generator。 我在 prizm-plugin 的 pom.xml 中添加了以下行:

<dependency>
  <groupId>org.kohsuke.metainf-services</groupId>
  <artifactId>metainf-services</artifactId>
  <version>1.1</version>
  <optional>true</optional>
</dependency>

HelloWorldPlugin 类的开头是这样的:

@MetaInfServices(JmjrstPlugin.class) 
public class HelloWorldPlugin extends JmjrstPlugin{ ... }

META-INF/services generator 上的网站上写道:“在 JavaSE6 中使用 javac 时,会自动生成 META-INF/services/* 文件。不需要额外的编译器开关。这个库也可以正确处理增量编译。”

在我的情况下,什么都没有生成。有人可以帮我吗?

【问题讨论】:

    标签: java eclipse maven meta-inf serviceloader


    【解决方案1】:

    从您的班级HelloWorldPlugin 的代码 sn-p 中,不清楚哪个接口是“合同”。在您提供的链接中:

    如果您有多个接口和/或基本类型,则库无法推断合同类型。在这种情况下,通过将其提供给 @MetaInfServices 来明确指定合同类型 ..

    因此,首先您必须确定您希望履行哪个合同,并且如果父类实现了多个合同,那么您需要在 @MetaInfServices 注释中明确声明哪个合同。

    这是我认为要检查的第一件事。

    【讨论】:

    • 那里只有一种基本类型。但我已经尝试过了:@MetaInfServices(JmjrstPlugin.class) public class HelloWorldPlugin extends JmjrstPlugin{ ... } 现在仍然成功
    • @ArminBeda 我遇到了完全相同的问题(也与您的任务完全相同...#kit)-您找到解决方案了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2015-12-29
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多