【发布时间】:2020-05-24 08:48:42
【问题描述】:
我使用了一个源自 CodeFx 的书和代码示例 (here) 的工作示例,我将其剥离为基本要素:
- 监控模块
- Monitor Observer 模块
- 模拟观察服务模块
这三个都在 Github here 上可见。
目标是让 Monitor 模块使用 Mock Observed Service。 2 不应耦合,因为 Mock 服务可以在运行时被另一个服务替换(例如,使用 Update4J 下载并在模块路径上添加这个新服务)。
但我被困在一个基本的水平:
在 Monitor 模块中,此行返回一个空列表:没有找到 ServiceObserverFactory:
List<ServiceObserverFactory> observerFactories = ServiceLoader
.load(ServiceObserverFactory.class).stream()
.map(Provider::get)
.collect(toList());
我从codefx's readme 看到这可能是由于 Maven 构建:Monitor 模块没有“看到”其他两个模块。我应该在 Maven 中添加对它们的引用。但如果这样做,我会重新引入一些耦合,从而阻止我在运行时添加另一个服务实现。
有没有办法让这个代码示例在不重新引入任何紧密耦合的情况下工作?
[最后一点:我在其他地方看到了“layers”的概念:这是要走的路吗?]
【问题讨论】:
标签: java maven java-module serviceloader