Re-augment a Quarkus Application

What is augmentation?

Quarkus 应用程序配置可能包含两种类型的配置选项:

  • * 构建时间选项在应用程序构建过程中处理;

  • * 运行时选项,可在应用程序构建后但在启动之前进行调整。

增强是应用程序构建过程的一个阶段,在此阶段,根据应用程序构建时间配置对应用程序的字节码进行优化。以前在 Jakarta EE 服务器上部署 EAR 文件时发生的初始化步骤(如解析静态配置、创建代理实例等)现在在增强时发生。增强后添加的 CDI bean 将无法正常工作(因为缺少代理类),并且在增强后更改的构建时间属性(例如 quarkus.datasource.db-kind)将会被忽略。构建时间属性在 list of all configuration options 中用锁图标 () 标记。无论您使用配置文件还是任何其他方式来覆盖属性都无关紧要。

重新增强是为不同的构建时间配置重新创建增强输出的过程

When is re-augmentation useful?

重新增强对于您的应用程序用户希望能够更改其一些构建时间属性的情况很有用。例如更改数据库驱动程序或开启或关闭特性(例如 OpenTelemetryConfig Consul)。如果只有两个或三个构建时间属性依赖于用户环境,您可以考虑提供应用程序的备用版本。但是,如果有更多这样的属性,您可能更愿意提供一个可变 jar,并让您的用户为他们的环境重新增强应用程序。请注意,您无法对包类型 mutable-jar 使用本机映像。考虑后果以及您还有哪些其他选择!

除非您怀念启动服务器需要几分钟的时间,并且您可以在服务器准备好之前享受一杯咖啡,否则在运行时进行重新增强并不是一个好主意。

How to re-augment a Quarkus application

为了运行增强步骤,您需要所用 Quarkus 扩展的部署 JAR。这些 JAR 仅存在于 mutable-jar 发行版中。这意味着您需要使用 quarkus.package.jar.type=mutable-jar 构建您的应用程序。mutable-jar 发行版与 fast-jar 发行版相同,不同之处在于附加的文件夹 quarkus-app/lib/deployment,其中包含部署 JAR 及其依赖项(以及一些类加载器配置)。

默认情况下,如果构建时属性在运行时已更改,您会收到一个警告。您可以设置 quarkus.configuration.build-time-mismatch-at-runtime=fail 属性以确保应用程序在不匹配的情况下不会启动。然而,截至本文撰写之时,在运行时更改 quarkus.datasource.db-kind 既不会失败,也不会产生警告,而是会被静默忽略。

构建工具提供的构建时配置(Maven 中的 properties``pom.xml 或 Gradle 中的 gradle.propertiesquarkus 命名空间中的将成为 mutable-jar 分发的一部分,包括来自 quarkus 的配置,它们引用机密或密码。请不要在构建工具配置文件中包含敏感信息。

1. Build your application as mutable-jar

mvn clean install -Dquarkus.package.jar.type=mutable-jar

2. Re-augment your application with a different build time configuration

为了用不同的构建时属性重新扩充您的 Quarkus 应用程序,请使用所需的配置启动应用程序,再加上设置为 truequarkus.launch.rebuild 系统属性。

以下示例将 quarkus.datasource.db-kind 更改为 mysql。为了实现这一点,mysql-extension 必须已包含在构建中。扩充只能使用编译时已存在的扩展。

java -jar -Dquarkus.launch.rebuild=true -Dquarkus.datasource.db-kind=mysql target/quarkus-app/quarkus-run.jar

使用系统属性、环境变量、配置还是外部配置文件并不重要。当前配置将用于扩充(quarkus-app/quarkus 的内容将用新的扩充输出替换)。上述命令行不会启动该应用程序。Quarkus 将在应用程序重新扩充后立即退出。

3. Optional: Delete the deployments folder

您可以删除目录 quarkus-app/lib/deployment 以节省 ZIP 分发或 Docker 映像中的一些空间(记住使用多级 Docker 构建以避免不必要的层)。删除 deployment 目录后,显然不再有可能重新扩充该应用程序。