当前位置: 首页 > 知识库问答 >
问题:

如何解决Quarkus中的多模块类路径bean?

淳于哲
2023-03-14

在Spring中,可以在单独的模块中定义bean依赖项,然后在运行时通过classpath解析这些依赖项。在Quarkus中有可能做类似的事情吗?

例如,多模块设置如下所示:

- service
- service-test
- service-artifact

在Spring中,可以在服务模块中定义@配置,该模块通过其当前上下文的类路径在运行时解析具体的依赖关系,服务测试服务工件,允许在测试时注入虚拟或测试依赖关系,还有生产人工制品中的真品。

例如,service中的一个类需要一个某物接口的实例。某物接口的实现在-test-artiact模块中定义。service模块不直接依赖于-test-artiact模块。

一些代码:

服务模块中:

@ApplicationScoped
class OrderService(private val repository: OrderRepository) {
    fun process(order: Order) {
        repository.save(order)
    }
}

interface OrderRepository {
    fun save(order: Order)
}

service-test模块中:

class InMemoryOrderRepository : OrderRepository {
    val orders = mutableListOf<Order>()
    override fun save(order: Order) {
        orders.add(order)
    }
}

class OrderServiceTestConfig {
    @ApplicationScoped
    fun orderRepository(): OrderRepository {
        return InMemoryOrderRepository()
    }
}


@QuarkusTest
class OrderServiceTest {

    @Inject
    private lateinit var service: OrderService

    @Test
    fun `injected order service with resolved repository dependency`() {
        // This builds and runs OK            
        service.process(Order("some_test_order"))
    }
}

我曾尝试在Quarkus中复制如上所述的Spring样式设置,但ArC验证在服务模块的构建上失败,因为未满足解决方案异常,即使实际使用的所有地方都提供了正确的依赖项;测试成功解析依赖项并通过。

我如何使用Quarkus实现依赖接口与实现的分离,并使ArC验证满意?

(注意:Java和Maven也会出现这种行为。)

我在这里包括了一个maven的例子。请注意,/mvnw安装失败,出现未满足的解决方案异常,但可以使用成功构建和运行测试/mvnw测试

生成文件:

根项目build。格雷德尔。kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

    plugins {
        kotlin("jvm") version "1.3.72"
        kotlin("plugin.allopen") version "1.3.72"
    }

allprojects {

    group = "my-group"
    version = "1.0.0-SNAPSHOT"

    repositories {
        mavenLocal()
        mavenCentral()
    }
}

subprojects {

    apply {
        plugin("kotlin")
        plugin("kotlin-allopen")
    }

    java {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    
    allOpen {
        annotation("javax.ws.rs.Path")
        annotation("javax.enterprise.context.ApplicationScoped")
        annotation("io.quarkus.test.junit.QuarkusTest")
    }

    apply {
        plugin("kotlin")
    }

    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
        kotlinOptions.javaParameters = true
    }
}

build。格雷德尔。kts用于服务

import io.quarkus.gradle.tasks.QuarkusDev

plugins {
    id("io.quarkus") version "1.9.1.Final"
}

apply {
    plugin("io.quarkus")
}

dependencies {
    implementation(project(":common:model"))
    implementation(enforcedPlatform("io.quarkus:quarkus-universe-bom:1.9.1.Final"))
    implementation("io.quarkus:quarkus-kotlin")
}

build。格雷德尔。kts用于维修测试

import io.quarkus.gradle.tasks.QuarkusDev

plugins {
    id("io.quarkus") version "1.9.1.Final"
}

apply {
    plugin("io.quarkus")
}

dependencies {
    implementation(project(":service"))
    implementation(enforcedPlatform("io.quarkus:quarkus-universe-bom:1.9.1.Final"))
    implementation("io.quarkus:quarkus-kotlin")
    testImplementation("io.quarkus:quarkus-junit5")
}

共有1个答案

仲和韵
2023-03-14

尝试使用实例注入(java示例):

import javax.enterprise.inject.Instance;
...
@Inject
Instance<MyBeanClass> bean;
...
bean.get(); // for a single bean
bean.stream(); // for a collection
 类似资料:
  • 问题内容: 我想检测模块是否已更改。现在,使用inotify很简单,您只需要知道要从中获取通知的目录即可。 如何在python中检索模块的路径? 问题答案: 实际上,至少在Mac OS X上,将为你提供已加载的.pyc文件的路径。因此,我想你可以这样做: 你也可以尝试: 获取模块的目录。

  • 我的问题似乎类似于运行在Quarkus(gradle)上的多模块项目中的ClassCastException。 不过我用的是maven。我可以确认在使用转轮或测试时没有出现问题。我创建了一个示例应用程序,在https://github.com/AmsterdamFilho/quarkus-poc. 如果在开发模式下运行应用程序,并使用swagger ui或curl执行endpoint,则会出现异常

  • 问题内容: 在我的Go项目中,我想将一些通用功能分解为Go模块,与主项目分开。为了配合go的未来,我正在GOPATH之外进行此操作。我不想在GitHub或其他任何地方发布该模块。 我将这个模块导入主项目的所有尝试导致: 我已经在模块的文件夹中运行了。其文件的内容是: 构建或安装此模块似乎无济于事。我在中没有发现任何迹象。 我尝试了多种导入语句: (模块目录的相对路径) (目录+模块名称的路径) 救

  • 我刚到爪哇。我正在上大学初学者Java课程。我正在运行我的第一个hello world代码,并得到一条错误消息。我已经安装了最新的Dr.Java稳定版本,并安装了Java SE 12 JDK。 我已经卸载和重新安装了几次Dr Java,但仍然收到错误消息。我也重新编译了它,但错误信息仍然存在。 我希望代码输出在interactions窗格下显示“Hello World”,但事实并非如此,而是出现了

  • 在使用Maven一段时间后,我对Maven在构建体系结构中带来的许多特性感到兴奋,尤其是依赖项管理。然而,我一次又一次地遇到了一个问题--Maven如何解决多模块项目之间的依赖关系。我想知道这是否是当前Maven实现的大缺陷和/或是否有任何令人满意的解决方案。 假设我有一个多模块的Maven项目。父pom包含三个模块--moduleA(jar)、moduleB(jar)和moduleC(war)。

  • 问题内容: 面对Jigsaw的相关更改,我似乎找不到任何信息,以了解是否仍然可以在运行时扫描所有可用的类(用于接口,批注等),就像Spring,Reflections和当前其他许多框架和库那样。类的加载方式。 编辑 :此问题是关于 扫描 实际的物理文件路径以查找类。另一个问题是关于动态 加载 类和资源。它是相关的,但 绝不是重复的 。 更新 :Jetty项目已经为此制定了标准化API的 JEP提案