这篇博文是在我写的关于装备Quarkus应用程序的第一篇博文之后。因此,假如你想知道怎么运用一致装备(application.properties文件)、Microprofile装备或体系特点来装备Quarkus应用程序,请参考这篇上一篇文章。在这篇博文中,我将告知你怎么在Quarkus中运用装备文件。

运用事例

我将运用与上一篇文章相同的比如:咱们有一个REST端点,运用一个存储库来耐久化和检索数据库中的书籍

  • BookResource:一个JAX-RS端点,有一组办法能够运用BookRepository来获取、POST、UPDATE和DELETE书籍。
  • BookRepository:与EntityManager打交道的事务性资源库,用于耐久化、检索、更新和删除关系数据库中的数据。
  • 书。JPA实体,代表一本书
  • application.properties:特点文件,咱们依据装备文件来装备Quarkus应用程序。
  • import-dev.sql和import-test.sql,依据装备文件导入数据库中的数据。
  • BookResourceTest。Quarkus测验类运用RESTAssured来测验BookResource。
  • 开发中运用Postgres,测验中运用H2。

就业务逻辑而言,这是个简略的应用。这篇博文的目的是向你展示Quarkus怎么依据装备文件(dev, test, prod, your own profile…)来装备这个应用程序。

Quarkus装备文件

Quarkus支持Profiles的概念(假如你知道Spring Profile,它有点相似)。这些允许你在同一个application.properties文件中对每个profile进行多个装备。其语法是%{profile}.config.key=value。因此,假如咱们的应用程序需求一个叫做isbn.prefix的变量,下面的装备将为一切装备文件设置1234的值,但这个值在装备文件dev和test中被掩盖:

isbn.prefix=1234
%dev.isbn.suffix=DEV
%test.isbn.suffix=TEST

在默许情况下,Quarkus有三个装备文件:

  • dev – 在开发形式下激活(例如:mvn quarkus:dev)
  • test – 在运行测验时激活(即mvn test)
  • prod – 不在开发或测验形式下运行时的默许装备文件。

正如你将在下面看到的,创立你自己的装备文件并运用你自己的装备文件装备构建你的应用程序非常简略。

用装备文件装备应用程序

默许情况下,Quarkus经过读取坐落src/main/resources目录下的application.properties文件来装备一个应用程序。在上一篇文章中,我向你展示了怎么具有一个用于开发的application.properties文件和另一个用于测验的文件。可是运用profiles,你不用有单独的application.properties文件:你把一切的装备集中在一个特点文件中,并运用profile来区分开发和测验。

在下面的application.properties文件中,咱们有对一切装备文件都可用的大局特点(如isbn.prefix或quarkus.datasource.url),但咱们也依据装备文件掩盖一些特点(如%dev.isbn.senix或%test.isbn.senix):

# GLOBAL
isbn.prefix=1234
quarkus.datasource.url = jdbc:postgresql://localhost:5432/cdbookstoreDB
quarkus.datasource.driver = org.postgresql.Driver
quarkus.datasource.username = cdbookstoreDB
quarkus.datasource.password = h2g2
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.hibernate-orm.log.sql=false
quarkus.log.category."org.agoncal".level=WARN
# DEV
%dev.quarkus.hibernate-orm.log.sql=true
%dev.quarkus.hibernate-orm.sql-load-script = import-dev.sql
%dev.quarkus.log.category."org.agoncal".level=INFO
%dev.isbn.suffix=DEV
# TEST
%test.quarkus.datasource.url = jdbc:h2:mem:cdbookstoreDB
%test.quarkus.datasource.driver = org.h2.Driver
%test.quarkus.hibernate-orm.database.generation=drop-and-create
%test.quarkus.hibernate-orm.log.sql=true
%test.quarkus.hibernate-orm.sql-load-script = import-test.sql
%test.quarkus.log.category."org.agoncal".level=DEBUG
%test.isbn.suffix=TEST

这个单一的application.properties文件告诉Quarkus在测验中运用H2数据库(%test.quarkus.datasource.driver = org.h2.Driver),在一切其他装备文件中运用Postgres(quarkus.datasource.driver = org.postgresql.Driver)。

依据装备文件履行SQL

假如你运用Hibernate,你或许知道要在启动时履行一些SQL句子(例如,将数据加载到数据库中),你只需在资源目录的根部增加一个import.sql文件。这种行为现已经过profile进行了扩展。你能够给profile的姓名加上后缀,并且有一个文件叫做import-dev.sql,只为开发装备文件供给SQL句子,或许为测验装备文件供给import-test.sql。

创立一个新的装备文件

Quarkus带有3个装备文件(dev, test, prod),但咱们或许需求其他的装备文件。这很简略做到,由于Quarkus将简略地运用quarkus-profile体系特点或QUARKUS_PROFILE环境变量。比方说,咱们有一个暂存环境,想为这个环境设置一些特定的值。这仅仅在application.properties中增加这些带有%staging前缀的变量的问题:

# STAGING
%staging.quarkus.log.category."org.agoncal".level=INFO
%staging.isbn.suffix=STAG

然后,你设置体系变量。例如,假如你想运用staging profile进行开发,只需履行:mvn -Dquarkus-profile=staging compile quarkus:dev。

在启动时显现装备文件

假如咱们创立了许多装备文件,咱们终究或许会迷失方向,不知道某个特定的应用程序是用哪个装备文件构建的。那么,怎么在启动时显现当前的装备文件呢?为此,咱们能够运用一个美丽的Quarkus小技巧。Quarkus让咱们有才能在应用程序初始化和停止时履行代码。这是由于Quarkus依赖于CDI,咱们只需求调查StartupEvent和ShutdownEvent。感谢io.quarkus.runtime.configuration.ProfileManager,这仅仅一个调用办法来显现活动装备文件的问题:

@ApplicationScoped
public class ApplicationLifeCycle {
  @Inject
  Logger logger;
  void onStart(@Observes StartupEvent ev) {
    logger.info("The application is starting with profile " + ProfileManager.getActiveProfile());
  }
}

用不同的装备文件履行

Microprofile装备还允许你经过传递体系特点(也包含环境变量)来装备应用程序。你能够在HotSpot上运行时这样做(经过向JVM传递变量,如java -Disbn.prefix=PROD)或向可履行二进制文件传递特点。让咱们这样做吧。

Quarkus的长处之一是,由于Graal VM的存在,它能够用来构建本地代码。要做到这一点,你需求装置Graal VM,设置GRAALVM_HOME变量。然后,让Maven和Quarkus插件完结其他作业,只需履行mvn clean package -Pnative命令。终究在目标文件夹中出现一个二进制文件(在本例中,该文件为52Mb,名为configuration-1.0-runner)。然后你能够用-D来履行这个二进制文件,传递特点。正如你在下面看到的,咱们掩盖了isbn.prefix特点:

$ mvn compile quarkus:dev
INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 658ms
INFO  [ApplicationLifeCycle] (main) The application is starting with profile dev
$ mvn -Dquarkus-profile=staging compile quarkus:dev
INFO  [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation
INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 613ms
INFO  [ApplicationLifeCycle] (main) The application is starting with profile staging

定论

Microprofile Config带来了开箱即用的装备,但Quarkus经过完成profile的概念走得更远。由于咱们的应用程序在开发和出产过程中的行为不尽相同,运用的资源也不一样,所以你能够在application.properties文件中为每个profile设置特点。Quarkus带有一个开发、测验和出产装备文件,但你能够创立你自己的。

下载代码,试一试并留下一些评论。

参考资料

  • 装备一个Quarkus应用程序
  • 应用程序的初始化和停止
  • 用Maven构建Quarkus应用程序
  • Quarkus小贴士
  • 怎么用Hibernate导入初始数据到数据库?