【问题标题】:Java app with JDK 9 modules: ServiceLoader not finding service (because of Maven build?)带有 JDK 9 模块的 Java 应用程序:ServiceLoader 找不到服务(因为 Maven 构建?)
【发布时间】: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


    【解决方案1】:

    需要涉及模块层。 Paul Bakker 给出了一个完整的工作示例in this code repo(他们的书的配套站点:“Java 9 Modularity”)。

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 2018-03-26
      • 2015-01-18
      相关资源
      最近更新 更多