带有JDK 9模块的Java应用。ServiceLoader找不到服务(因为Maven的构建?

问题描述 投票:0回答:1

我使用了一个从CodeFx的书和代码示例中衍生出来的工作示例(此处),我把它剥离到了本质上。

  • 一个监控模块
  • a 监测观察员模块
  • 一个模拟观察服务模块

三者在Github上都可以看到 此处.

我们的目标是让Monitor模块使用Mock Observed服务,这两个模块不应该耦合,因为Mock服务可以在运行时被另一个服务(使用)取代。这两个模块不应该被耦合,因为Mock服务可以在运行时被另一个服务所取代(用 更新4J 例如,下载并在模块路径上添加这个新服务)。)

但我卡在了一个基本的层面上。

在Monitor模块中,这一行返回一个空的List:no ServiceObserverFactory 已被发现。

List<ServiceObserverFactory> observerFactories = ServiceLoader
                .load(ServiceObserverFactory.class).stream()
                .map(Provider::get)
                .collect(toList());

我看到从 codefx的readme 可能是由于Maven构建的原因:Monitor模块没有 "看到 "其他两个模块。我应该在Maven中添加一个对它们的引用,但如果我这样做,就会重新引入一些耦合,使我无法在运行时添加另一个服务实现。但如果我这样做,就会重新引入一些耦合,使我无法在运行时添加另一个服务实现。

有什么方法可以让这个代码示例在不重新引入任何紧密耦合的情况下工作?

最后说明:我看到了""的概念。层次"其他地方:是这样的吗?]

java maven java-module serviceloader
1个回答
0
投票

模块层都需要涉及。给出了一个完整的工作示例 在这个代码库中 作者:Paul Bakker(他们的书的配套网站:"Java 9 Modularity")。

© www.soinside.com 2019 - 2024. All rights reserved.