Quarkus - gradle 子模块之间不满意的依赖关系

问题描述

我知道空的 beans.xml 如何解决问题,如所描述的 here

问题是当子模块之间的依赖具有相反的方向时,我们如何获得类似的结果。 所以基于链接问题的例子 如果不是这个设置怎么办

// service-module build.gradle
dependencies {
   implementation project(":library-module")
}

我们有这个

// library-module build.gradle
dependencies {
   implementation project(":service-module")
}

作为一个用例,考虑一个遵循 ports & adapters 架构的服务, 其中端口位于 application 模块中,适配器实现位于 adapters 模块中。

// application module

public interface WebPort {}

---

@ApplicationScoped
public class AppService {

   @Inject
   WebPort webPort;
   ...
}
//adapters module

// build.gradle
dependencies {
   // this is in order to have the WebPort available
   implementation project(":application")
}

@ApplicationScoped
public class WebAdapter implements WebPort {
    ...
}

目前,此设置会抛出 UnsatisfiedResolutionException,因为应用程序模块无法看到 WebAdapter bean。

是否可以有类似的工作设置?


更新

我已经弄清楚是什么问题了。 显然在两个模块的 build.gradle 中都声明了 quarkus 插件会导致混淆。 似乎有以下依赖

dependencies {
   // this is in order to have the WebPort available
   implementation project(":application")
}

指示 gradle 首先开始构建 application 模块,这是有道理的,但在这种特定情况下会导致未满足依赖错误,因为实现 bean 存在于尚未构建的 adapters 模块中.

application 模块中删除 quarkus 插件似乎可以解决问题。 或者,可以选择创建第三个模块,其中包含 2 个原始模块作为依赖项,并且仅在第三个模块中具有 quarkus 插件,通过具有以下类,它可以成为整个应用程序的入口点,例如:

@QuarkusMain
public class Main {

    public static void main(String... args) {
        Quarkus.run(args);
    }
}

上述设置解决了该问题,但 Intellij 上仍然存在不满意依赖项的烦人警告。如果有办法让 Intellij 了解正在发生的事情,那就太好了。对此的任何提示都非常受欢迎。

附注。如果有人可以提供更优雅的解决方案,我会稍等一下,否则我将在答案中移动此更新部分。

解决方法

我已经弄清楚是什么问题了。显然在两个模块的 build.gradle 中都声明了 quarkus 插件会导致混淆。似乎有以下依赖

dependencies {
   // this is in order to have the WebPort available
   implementation project(":application")
}

指示 gradle 首先开始构建应用程序模块,这是有道理的,但在这种特定情况下会导致未满足依赖错误,因为实现 bean 存在于尚未构建的适配器模块中。

从应用程序模块中删除 quarkus 插件似乎解决了这个问题。或者,可以选择创建第三个模块,其中包含 2 个原始模块作为依赖项,并且仅在第三个模块中具有 quarkus 插件,通过具有以下类,它可以成为整个应用程序的入口点,例如:

@QuarkusMain
public class Main {

    public static void main(String... args) {
        Quarkus.run(args);
    }
}

上述设置解决了该问题,但 Intellij 上仍然存在不满意依赖项的烦人警告。如果有办法让 Intellij 了解正在发生的事情,那就太好了。对此的任何提示都非常受欢迎。