Java 具有 JDK 9 个模块的应用程序:ServiceLoader 找不到服务(因为 Maven 构建?)
Java app with JDK 9 modules: ServiceLoader not finding service (because of Maven build?)
我使用了一个源自 CodeFx 的书和代码示例 (here) 的工作示例,我将其精简为要点:
- 一个监控模块
- 一个Monitor Observer模块
- 模拟观察服务模块
所有三个都在 Github here.
上可见
目标是让 Monitor 模块使用 Mock Observed Service。 2 不应耦合,因为 Mock 服务可能会在 运行 时间被另一个服务替换(例如,使用 Update4J 下载并在模块路径上添加此新服务)。
但我还停留在基本水平:
在监控模块中,这一行returns一个空列表:没有找到ServiceObserverFactory
:
List<ServiceObserverFactory> observerFactories = ServiceLoader
.load(ServiceObserverFactory.class).stream()
.map(Provider::get)
.collect(toList());
我从 codefx's readme 看到这可能是由于 Maven 构建:Monitor 模块没有 'see' 其他两个模块。我应该在 Maven 中添加对它们的引用。但是如果我这样做,我会重新引入一些耦合,阻止我在 运行 时间添加另一个服务实现。
有没有一种方法可以让这个代码示例在不重新引入任何紧耦合的情况下工作?
[最后说明:我在其他地方看到了“layers”的概念:这是要走的路吗?]
需要涉及模块层。 Paul Bakker in this code repo 给出了一个完整的工作示例(他们的书的配套站点:"Java 9 Modularity")。
我使用了一个源自 CodeFx 的书和代码示例 (here) 的工作示例,我将其精简为要点:
- 一个监控模块
- 一个Monitor Observer模块
- 模拟观察服务模块
所有三个都在 Github here.
上可见目标是让 Monitor 模块使用 Mock Observed Service。 2 不应耦合,因为 Mock 服务可能会在 运行 时间被另一个服务替换(例如,使用 Update4J 下载并在模块路径上添加此新服务)。
但我还停留在基本水平:
在监控模块中,这一行returns一个空列表:没有找到ServiceObserverFactory
:
List<ServiceObserverFactory> observerFactories = ServiceLoader
.load(ServiceObserverFactory.class).stream()
.map(Provider::get)
.collect(toList());
我从 codefx's readme 看到这可能是由于 Maven 构建:Monitor 模块没有 'see' 其他两个模块。我应该在 Maven 中添加对它们的引用。但是如果我这样做,我会重新引入一些耦合,阻止我在 运行 时间添加另一个服务实现。
有没有一种方法可以让这个代码示例在不重新引入任何紧耦合的情况下工作?
[最后说明:我在其他地方看到了“layers”的概念:这是要走的路吗?]
需要涉及模块层。 Paul Bakker in this code repo 给出了一个完整的工作示例(他们的书的配套站点:"Java 9 Modularity")。