Quarkus入门

Quarkus – 一个为OpenJDK HotSpot和GraalVM量身定制的Kubernetes本机Java堆栈,它是从最佳Java库和标准中精制而成的。 –是一个容器优先的框架,针对快速启动时间和低内存消耗进行了优化。 该框架基于许多流行的Java库构建,并且为构建标准REST以及响应式消息驱动型微服务提供支持。 由于快速的启动时间和较低的内存使用量,Quarkus还可以用于在无服务器环境中实现功能。 凭借统一的配置,出色的实时重新加载功能和工具支持,Quarkus为快速开发应用程序提供了许多可能性。

了解如何开始使用Quarkus和构建PetClinic REST API。

这篇博客文章涵盖:

  • 开发环境要求
  • 建立新专案
  • 使用Java 11开发,构建和运行应用程序
  • 使用Postgres和Flyway进行数据源配置
  • 分页CRUD服务
  • 创建集成测试
  • 实时重新加载和调试
  • Docker化应用程序(本机和非本机)

关于PetClinic API

我决定重新使用在本博客文章Spring Boot和Spring Data REST中使用的PetClinic模型。

基本上,这是一个基本的CRUD服务,用于管理虚构的PetClinic:宠物,兽医,来访等。

先决条件

码头工人

Docker将用于运行服务本身的dockerized版本,但也将用于运行PostgreSQL服务器。

带有GraalVM的JDK 11

PetClinic API将使用Java 11构建,因此必须安装JDK 11。 为了构建本机可执行文件,必须提供GraalVM 19.3+,并且由于它是基于OpenJDK 11构建的,因此这将是本教程的最佳选择。 安装(和管理多个版本)Java SDK的最简单方法是使用SDKMAN!

了解如何使用SDKMAN管理多个Java SDK! 轻松

要支持本机映像,请确保安装所有必需的依赖项。 可以在GraalVM文档中找到更多信息: https ://www.graalvm.org/docs/reference-manual/native-image/

GraalVM官方文档: GraalVM

终奌站

该服务是使用iTerm2oh-my-zsh在macOS上开发的。 我还将httpie用作默认的HTTP客户端。

IntelliJ

我首选的IDE是IntelliJ,我在从事此项目时就使用了它。

在本文中了解有关我在macOS上使用的工具的更多信息: macOS:(Java)开发人员的基本工具

使用Docker运行PostgreSQL

该应用程序将连接到Postgres服务器,并根据配置文件( devtestprod )应用不同的配置。 为此,我们将需要运行三台服务器:每台服务器具有不同的数据库名称,端口和凭据。 为了简化设置,可以使用Docker。

开发数据库

  • 创建并运行容器:
 $ docker run --name petclinic-db-dev -p 5433 : 5432 -e POSTGRES_DB=petclinic-dev -e POSTGRES_USER=petclinic-dev -e POSTGRES_PASSWORD=petclinic-dev -d postgres:alpine 
  • 运行先前停止的容器:
 $ docker start petclinic-db-dev 

测试数据库

  • 创建并运行容器:
 $ docker run --name petclinic-db-test -p 5434 : 5432 -e POSTGRES_DB=petclinic-test -e POSTGRES_USER=petclinic-test -e POSTGRES_PASSWORD=petclinic-test -d postgres:alpine 
  • 运行先前停止的容器:
 $ docker start petclinic-db-test 

产品数据库

  • 创建并运行容器:
 $ docker run --name petclinic-db -p 5432 : 5432 -e POSTGRES_DB=petclinic -e POSTGRES_USER=petclinic -e POSTGRES_PASSWORD=petclinic -d postgres:alpine 
  • 运行先前停止的容器:
 $ docker start petclinic-db 

入门

引导应用程序

您可以在命令行中使用Maven引导应用程序,也可以使用在线生成器。 在线生成器允许探索可以构成Quarkus应用程序的扩展和技术,并且不需要本地Maven安装。 您可以在此处访问生成器: https : //code.quarkus.io

需要以下扩展来构建PetClinic API服务:

  • RESTEasy JAX-RS –实现JAX-RS等的REST框架
  • RESTEasy Jackson –对RESTEasy的Jackson序列化支持
  • SmallRye OpenAPI –使用OpenAPI记录您的REST API – Swagger UI随附
  • 带有Panache的Hibernate ORM –在带有Panache的Hibernate ORM中定义持久性模型
  • Hibernate Validator –验证进入您的REST端点的数据
  • JDBC驱动程序– PostgreSQL – PostgreSQL数据库连接器
  • Flyway –处理数据库架构迁移

选择依赖项后,您可以下载zip,解压缩并开始开发服务。

下载的项目具有标准的Maven项目布局。 它包含Maven包装器,因此不需要本地Maven安装即可开发项目。 您还将注意到src/main/docker与本地和JVM映像的Docker文件一起。

主要配置文件application.properties位于src/main/resources 。 此文件夹还包含META-INF/resources文件夹,用于存储应用程序的静态资源,例如index.html文件。

在线生成器默认情况下使用Java 8生成项目,因此,要使用Java 11,需要进行一些调整。

  • 在生成的项目的pom.xml中,更改Java版本:
 < maven.compiler.source >11</ maven.compiler.source > < maven.compiler.target >11</ maven.compiler.target > 
  • src/main/docker/Dockerfile.jvm设置ARG JAVA_PACKAGE=java-11-openjdk-headless

在开发模式下运行项目

进行更改后,您可以启动应用程序。 打开终端,导航到项目的文件夹并运行以下命令:

 $ ./mvnw compile quarkus:dev 

注意:Quarkus具有三种内置模式: devtestprod取决于您如何运行应用程序。

在IntelliJ中开发

在IntelliJ中,您只需打开项目的文件夹或pom.xml 。 ( File > Open )。 该项目只能使用Maven启动。 这可以通过Maven运行配置来完成,因为没有类可以启动应用程序,例如在Spring Boot中

对我来说,使用Quarkus进行开发时最好的体验是在IntelliJ外部的终端中运行应用程序时。

调试

当以开发模式执行Quarkus应用程序时,它将以启用的调试协议(在端口5005上)启动。 要在IntelliJ中调试Quarkus应用程序,您需要通过Run > Attach to Process调试器附加到正在Run > Attach to Process 。 我没有调试应用程序的麻烦。

注意:可以在禁用调试的开发模式下运行该应用程序: ./mvnw quarkus:dev -Ddebug=false ,但老实说,默认情况下启用调试器时,我没有发现任何性能问题。

实时重载

我认为,实时重新加载是Quarkus最强大的功能。 效果惊人。 基本上,您可以更改源代码中所需的任何内容,执行请求,然后眨眼间即可重新加载应用程序。 我正在重新整理类和程序包,移动文件,添加和删除端点,而所有这些操作都没有一次重启。

数据源配置

所有属性都转到src/main/resources/application.properties

默认数据源属性(

 quarkus.datasource.url=jdbc:postgresql: //localhost:5432/petclinic  quarkus.datasource.driver=org.postgresql.Driver  quarkus.datasource.username=petclinic  quarkus.datasource.password=petclinic 

Dev数据源属性(

要设置模式(或配置文件)的特定属性,请使用%mode

 %dev.quarkus.datasource.url=jdbc:postgresql: //localhost:5433/petclinic-dev  %dev.quarkus.datasource.username=petclinic-dev  %dev.quarkus.datasource.password=petclinic-dev 

测试数据源属性(

 %test.quarkus.datasource.url=jdbc:postgresql: //localhost:5434/petclinic-test  %test.quarkus.datasource.username=petclinic-test  %test.quarkus.datasource.password=petclinic-test 

另请参阅: https : //quarkus.io/guides/datasource

飞路迁移

要使用Flyway,请在src/main/resources创建db/migration文件夹,然后添加迁移文件。 我的第一个迁移文件称为V1.0.0__PetClinic.sql ,其中包含该服务的所有架构(DDL)和示例数据。

注意:Quarkus支持可以通过quarkus.hibernate-orm.sql-load-script为每个配置文件配置的SQL导入,但是我无法使其工作。 请参阅我在Github上报告的问题: https : //github.com/quarkusio/quarkus/issues/7358

另请参阅: https : //quarkus.io/guides/flyway

JPA实体

PetClinic的域模型相对简单,但是它包含一些单向和双向关联以及基本继承,这使其比简单的Hello World类型的模型要好一些。

请注意,在此示例中,JPA实体由相应的Panache存储库直接在JAX-RS资源中返回(请参见下文),因此,实体类包含JPA和Jackson批注的混合。

例如:

 @Entity  @Table (name = "visits" )  public class Visit extends BaseEntity { @Column (name = "visit_date" ) @JsonFormat (pattern = "yyyy/MM/dd HH:mm" ) private LocalDateTime date; @NotEmpty @Column (name = "description" ) private String description; @ManyToOne @JoinColumn (name = "pet_id" ) private Pet pet; @ManyToOne @JoinColumn (name = "vet_id" ) private Vet vet; public Visit() { this .date = LocalDateTime.now(); }  }  @Entity  @Table (name = "vets" , uniqueConstraints = @UniqueConstraint (columnNames = { "first_name" , "last_name" })  )  public class Vet extends Person { @ManyToMany (fetch = FetchType.EAGER) @JoinTable (name = "vet_specialties" , joinColumns = @JoinColumn (name = "vet_id" ), inverseJoinColumns = @JoinColumn (name = "specialty_id" )) @JsonIgnore private Set<Specialty> specialties; @OneToMany (cascade = CascadeType.ALL, mappedBy = "vet" , fetch = FetchType.EAGER) @JsonIgnore private Set<Visit> visits;  } 

所有实体都位于pl.codeleak.samples.petclinic.model包中。

休眠ORM与Panache

如果您熟悉Spring,我想您已经听说过Spring Data项目。 在我看来, 带有Panache的Hibernate ORM具有类似的目标:通过消除重复和繁琐的工作,简化了JPA的开发。 Panache支持排序,分页, java.util.Optionaljava.utitl.stream.Stream等。

你有两种方法来工作,以耀目:与创建实体PanacheEntity或创建库PanacheRepository 。 我在这个项目中尝试了两种方法,但是由于实体中的继承问题,我决定采用老式方法。

Hibernate ORM和Panache的基本存储库定义:

 public class OwnerRepository implements PanacheRepository<Owner> { List<Owner> findByLastName(String lastName) { return list( "lastName" , lastName); }  } 

所有存储库都位于pl.codeleak.samples.petclinic.repository包中。

另请参阅: https : //quarkus.io/guides/hibernate-orm-panache

创建REST API

JAX-RS资源

Quarkus将JAX-RS与RESTEasy结合使用。 要创建API端点,我们需要创建JAX-RS资源:

 @Path (OwnerResource.RESOURCE_PATH)  @Produces (MediaType.APPLICATION_JSON)  public class OwnerResource { public static final String RESOURCE_PATH = "/owners" ; @Context UriInfo uriInfo; @Inject OwnerRepository ownerRepository; @Inject PetRepository petRepository; @GET public Response getAll( @BeanParam PageRequest pageRequest) {         } @GET @Path ( "{id}" ) public Response getOne( @PathParam ( "id" ) Long id) { } @GET @Path ( "{id}/pets" ) public List<Pet> getPets( @PathParam ( "id" ) Long id) {     } @POST @Consumes (MediaType.APPLICATION_JSON) @Transactional public Response create( @Valid Owner owner) {     }  } 

依赖注入是通过CDI完成的–上下文和依赖注入 。 资源对象将由Quarkus自动配置。 必须将所有其他依赖项配置为具有CDI批注的依赖项注入。

例如,可以使用@ApplicationScoped注释存储库,然后使用@Inject注入存储库:

 @ApplicationScoped  public class OwnerRepository implements PanacheRepository<Owner> { List<Owner> findByLastName(String lastName) { return list( "lastName" , lastName); }  }  @ApplicationScoped  public class PetRepository implements PanacheRepository<Pet> {  } 

所有资源都位于pl.codeleak.samples.petclinic.api包中。

另请参阅: https : //quarkus.io/guides/cdi-reference

分页

如前所述,Panache为分页结果提供支持。 我们可以轻松地在我们的资源中轻松利用它:

 @GET  public Response getAll( @BeanParam PageRequest pageRequest) { return Response.ok(((PanacheRepository) petRepository).findAll() .page(Page.of(pageRequest.getPageNum(), pageRequest.getPageSize())) .list()).build();  } 

PageRequest是一个包含pageNumpageSize查询参数的bean:

 public class PageRequest { @QueryParam ( "pageNum" ) @DefaultValue ( "0" ) private int pageNum; @QueryParam ( "pageSize" ) @DefaultValue ( "10" ) private int pageSize;  } 

使用httpie可以轻松完成执行分页的请求:

 $ http get : 8080 /owners pageNum== 0 pageSize== 2  HTTP/ 1.1 200 OK  Content-Length: 250  Content-Type: application/json  [ { "address" : "110 W. Liberty St." , "city" : "Madison" , "firstName" : "George" , "id" : 1 , "lastName" : "Franklin" , "telephone" : "6085551023" }, { "address" : "638 Cardinal Ave." , "city" : "Sun Prairie" , "firstName" : "Betty" , "id" : 2 , "lastName" : "Davis" , "telephone" : "6085551749" }  ] 

交易次数

在JPA中创建新对象需要活动事务。 为了将事务绑定到资源对象中的当前方法,请使用@Transactional ,否则在方法执行期间将引发异常:

 @POST  @Consumes (MediaType.APPLICATION_JSON)  @Transactional  public Response create( @Valid Owner owner) { ownerRepository.persist(owner); var location = uriInfo.getAbsolutePathBuilder() .path( "{id}" ) .resolveTemplate( "id" , owner.getId()) .build(); return Response.created(location).build();  } 

使用httpie创建新资源:

 $ http post : 8080 /owners <<< '  { "address" : "110 W. Liberty St." , "city" : "Madison" , "firstName" : "George" , "lastName" : "Franklin" , "telephone" : "6085551023"  }'  HTTP/ 1.1 201 Created  Content-Length: 0  Location: http: //localhost:8080/owners/1042 

验证方式

该项目使用Hibernate Validator扩展。 使用此扩展,您可以使用标准的Hibernate验证注释(例如@NotBlank ),并且当资源方法的输入参数使用@Valid注释时,验证将自动触发,并且错误响应将返回给调用该方法的客户端。

以下请求的示例响应:

 $ http post : 8080 /owners <<< '{}'  HTTP/ 1.1 400 Bad Request  Content-Length: 626  Content-Type: application/json  validation-exception: true  { "classViolations" : [], "exception" : null , "parameterViolations" : [ { "constraintType" : "PARAMETER" , "message" : "must not be empty" , "path" : "create.owner.address" , "value" : "" },         ... { "constraintType" : "PARAMETER" , "message" : "must not be empty" , "path" : "create.owner.telephone" , "value" : "" } ], "propertyViolations" : [], "returnValueViolations" : []  } 

关于实时重新加载功能的注意事项:您可以对源代码进行任何更改,并使用httpie执行新请求。 该应用程序快速重新加载,您会立即获得结果。 无需重新启动。

另请参阅: https : //quarkus.io/guides/validation

Java 8日期和时间支持

RESTEasy Jackson扩展位于项目中时,在JSON序列化和反序列化期间支持java.util.time类型。

在以下示例中,访问日期以@JsonFormat批注提供的格式进行序列化和反序列化:

 @Entity  @Table (name = "visits" )  public class Visit extends BaseEntity { @Column (name = "visit_date" ) @JsonFormat (pattern = "yyyy/MM/dd HH:mm" ) private LocalDateTime date;  } 

检查如何使用htppie序列化日期:

 $ http get : 8080 /visits/ 1  HTTP/ 1.1 200 OK  Content-Length: 174  Content-Type: application/json  { "date" : "2013/01/01 00:00" , "description" : "rabies shot" , "id" : 1 , "pet" : { "birthDate" : "2012/09/04" , "id" : 7 , "name" : "Samantha" }, "vet" : { "firstName" : "Helen" , "id" : 2 , "lastName" : "Leary" }  } 

您还可以使用所需的日期时间格式将访问存储在请求正文中:

 $ http post : 8080 /visits <<< '  { "date" : "2020/01/01 00:00" , "description" : "lorem ipsum" , "pet" : { "id" : 7 }, "vet" : { "id" : 2 }  }'  HTTP/ 1.1 201 Created  Content-Length: 0  Location: http: //localhost:8080/visits/1042 

OpenAPI / Swagger支持

SmallRye OpenAPI扩展负责提供API文档,并且在开发模式下启用了SwaggerUI。

默认端点是:

  • OpenAPI文档– /openapi
  • SwaggerUI – /swaggerui

另请参阅: https : //quarkus.io/guides/openapi-swaggerui

整合测试

Quarkus使用JUnit 5和RESTAssured进行集成测试。 可以使用@QuarkusTest批注创建test ,并且默认情况下会在激活test配置文件的情况下执行test

 @QuarkusTest  public class PetResourceTest { @Test public void pagedList() { given() .when().get( "/pets?pageNum=0&pageSize=2" ) .then() .statusCode( 200 ) .body( "$.size()" , is( 2 ), "name" , containsInAnyOrder( "Leo" , "Basil" ) ); }  } 

Quarkus测试要求应用程序正在运行。 通过使用CDI @Alternate beans定义,可以替换测试中的选定bean。 备用bean必须放置在src/test/java

注意:由于有了配置文件支持,您可以使用单独的数据库容器轻松配置test配置文件的数据源。 请参阅测试数据源属性 。

另请参阅: https : //quarkus.io/guides/getting-started-testing

打包并运行应用程序

该应用程序可以打包为./mvnw package

它在/target目录中生成可执行文件quarkus-petclinic-api-1.0.0-runner.jar文件,并将依赖项复制到target/lib目录中。

 [INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: /Users/rafal.borowiec/Projects/quarkus/quarkus-petclinic-api/target/quarkus-petclinic-api- 1.0 . 0 -runner.jar  [INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1888ms  [INFO] ------------------------------------------------------------------------  [INFO] BUILD SUCCESS  [INFO] ------------------------------------------------------------------------  [INFO] Total time: 15.868 s  [INFO] Finished at: 2020 - 02 -23T19: 18 : 25 + 01 : 00  [INFO] ------------------------------------------------------------------------ 

现在可以使用java -jar target/quarkus-petclinic-api-1.0.0-runner.jar运行该应用程序。

 2020 - 02 - 23 19 : 19 : 10 , 169 INFO [io.quarkus] (main) quarkus-petclinic-api 1.0 . 0 (running on Quarkus 1.2 . 1 .Final) started in 2 .011s. Listening on: http: .011s. Listening on: http: //0.0.0.0:8080 .011s. Listening on: http: //0.0.0.0:8080  2020 - 02 - 23 19 : 19 : 10 , 171 INFO [io.quarkus] (main) Profile prod activated.  2020 - 02 - 23 19 : 19 : 10 , 171 INFO [io.quarkus] (main) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, rest-client, resteasy, resteasy-jackson, smallrye-openapi] 

注意: uber-jar可以与./mvnw clean package -DskipTests=true -Dquarkus.package.uber-jar=true一起打包。

创建以JVM模式运行应用程序的Docker容器

 $ ./mvnw clean package  $ docker build -f src/main/docker/Dockerfile.jvm -t quarkus/petclinic-api-jvm .  Successfully built 1a5d963fedfa  Successfully tagged quarkus/petclinic-api-jvm:latest 

使用链接运行容器,执行Postgres数据库容器,并使用环境变量覆盖数据源url:

 $ docker run -i --rm -p 8080 : 8080 --link petclinic-db -e QUARKUS_DATASOURCE_URL= 'jdbc:postgresql://petclinic-db/petclinic' quarkus/petclinic-api-jvm  2020 - 02 - 23 20 : 39 : 18 , 949 INFO [io.quarkus] (main) quarkus-petclinic-api 1.0 . 0 (running on Quarkus 1.2 . 1 .Final) started in 3 .475s. Listening on: http: .475s. Listening on: http: //0.0.0.0:8080 .475s. Listening on: http: //0.0.0.0:8080  2020 - 02 - 23 20 : 39 : 18 , 949 INFO [io.quarkus] (main) Profile prod activated.  2020 - 02 - 23 20 : 39 : 18 , 949 INFO [io.quarkus] (main) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, rest-client, resteasy, resteasy-jackson, smallrye-openapi 

注意: petclinic-db是在此处创建的Postgres容器的名称: Prod database 。 我们还需要传递数据源URL。 阅读有关在运行时覆盖配置属性的更多信息:在运行时覆盖属性

创建本机可执行文件

您可以使用以下命令创建本机可执行文件:

 $ ./mvnw package -Pnative  [INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building image from /Users/rafal.borowiec/Projects/quarkus/quarkus-petclinic-api/target/quarkus-petclinic-api- 1.0 [INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building native image from /Users/rafal.borowiec/Projects/quarkus/quarkus-petclinic-api/target/quarkus-petclinic-api- . 0 - native -image-source-jar/quarkus-petclinic-api- 1.0 . 0 -runner.jar  ...  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]  (typeflow): 72 , 535.72 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]   (objects): 49 , 325.68 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]  (features): 3 , 115.04 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]    analysis: 135 , 220.10 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]    (clinit): 1 , 966.77 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]    universe: 6 , 919.51 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]     (parse): 13 , 679.33 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]    (inline): 18 , 193.40 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]   (compile): 70 , 849.75 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]     compile: 111 , 062.75 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]       image: 8 , 843.46 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]       write: 1 , 789.58 ms  [quarkus-petclinic-api- 1.0 . 0 -runner: 50503 ]     [total]: 282 , 727.03 ms  [INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 287304ms  [INFO] ------------------------------------------------------------------------  [INFO] BUILD SUCCESS  [INFO] ------------------------------------------------------------------------  [INFO] Total time: 04 : 58 min  [INFO] Finished at: 2020 - 02 -23T19: 25 : 10 + 01 : 00  [INFO] ------------------------------------------------------------------------ 

创建本机可执行文件的过程需要花费一些时间,但是值得等待它完成以查看应用程序的启动时间:

 $ ./target/quarkus-petclinic-api- 1.0 . 0 -runner  2020 - 02 - 23 19 : 26 : 03 , 959 INFO [io.quarkus] (main) quarkus-petclinic-api 1.0 . 0 (running on Quarkus 1.2 . 1 .Final) started in 0 .066s. Listening on: http: .066s. Listening on: http: //0.0.0.0:8080 .066s. Listening on: http: //0.0.0.0:8080  2020 - 02 - 23 19 : 26 : 03 , 959 INFO [io.quarkus] (main) Profile prod activated.  2020 - 02 - 23 19 : 26 : 03 , 959 INFO [io.quarkus] (main) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, rest-client, resteasy, resteasy-jackson, smallrye-openapi] 

本机可执行文件启动为0.67秒,而JVM版本为2秒。

创建一个以纯模式运行应用程序的Docker容器

默认情况下,本机可执行文件以操作系统支持的格式创建。 由于容器使用的可执行文件格式可能与操作系统生成的格式不同,因此Maven构建可以从容器内部生成可执行文件:

 $ ./mvnw package -Pnative -Dquarkus. native .container-build= true 

要调整构建器映像的版本,您需要设置quarkus.native.builder-image属性:

 $ ./mvnw clean package -Pnative -DskipTests= true -Dquarkus. native .container-build= true -Dquarkus. native .builder-image=quay.io/quarkus/ubi-quarkus- native -image: 20.0 . 0 -java11 

现在,构建并运行容器:

 $ docker build -f src/main/docker/Dockerfile. native -t quarkus/petclinic-api .  $ docker run -i --rm -p 8080 : 8080 quarkus/petclinic-api 

注意:有关构建本机可执行文件的更多信息,请参见Quarkus文档: https ://quarkus.io/guides/building-native-image

源代码

可以在Github上找到本文的源代码: https : //github.com/kolorobot/quarkus-petclinic-api

翻译自: https://www.javacodegeeks.com/2020/02/getting-started-with-quarkus.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware6.5.2序列号_教你如何查询苹果序列号,查询是否为官换机、激活时间等

如何查询你刚买的苹果设备是否为官换机&#xff1f;或想知道它的激活日期&#xff1f;保修时间&#xff1f;那么赶紧收藏本篇教程吧&#xff01;众所周知&#xff0c;在苹果官网查询苹果设备&#xff0c;是查询不到具体的信息&#xff08;比如激活日期、保修日期、是否为官换机…

linux 几个文件夹作用,linux下每一个文件夹的作用.docx

目录结构及主要内容“/"根冃录部分有以F子冃录&#xff1a;/usr 口录包含所有的命令、程序库、文档和英它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的Linux 发行版本的主要的应用程序&#xff0c;辔如&#xff0c;Netscape0/var目录包含在1E常操作中被改…

参数化测试 junit_JUnit中的参数化测试运行器

参数化测试 junit我们都有书面的单元测试&#xff0c;其中在一个测试中针对不同的可能的输入输出组合进行测试。 让我们以一个简单的斐波那契数列示例为例&#xff0c;看看它是如何完成的。 以下代码针对提到的元素数量计算斐波那契数列&#xff1a; import java.math.BigInt…

python中dataframe合并列名日期到季度_python – 如何在特定日期范围内的pandas列DataFrame中对某些值求和...

我有一个大型的DataFrame,看起来像这样&#xff1a;df UPC Unit_Sales Price Price_Change Date0 22 15 1.99 NaN 2017-10-101 22 7 2.19 True 2017-10-122 22 6 2.19 NaN 2017-10-133 22 7 1.99 True 2017-10-164 22 4 1.99 NaN 2017-10-175 35 15 3.99 NaN 2017-10-096 35 17…

linux环境变量自动配置,Linux进入系统时自动配置 环境变量的要领

用Export命令能够配置环境变量&#xff0c;但是假如每回进入系统之后都要重新配置一遍环境变量就很烦人。Linux给大众提供了自动配置环境变量的要领&#xff0c;那就是修改.bashrc 文件。 通常说来&#xff0c;有两个文件能够提供这种“进入系统时自动配置”的功能&#xff0c;…

金融模型python_盘点金融领域里常用的深度学习模型

作者 | Sonam Srivastava &#xff0c;译者 | sambodhi &#xff0c;编辑 | Vincent &#xff0c;AI前线出品&#xff5c; ID&#xff1a;ai-front在今天我们发布的这篇文章中&#xff0c;作者 Sonam Srivastava 介绍了金融中的三种深度学习用例及这些模型优劣的证据。我们跟随…

Qute模板与Quarkus

Quarkus附带了自己的模板引擎Qute&#xff0c;该引擎已经包含了一组有趣的功能。 在下面的视频中&#xff0c;我将展示基于动作的MVC与JAX-RS的基本用法&#xff0c;该动作将我们的请求转发到HTML模板。 要自己尝试Qute&#xff0c;请查看以下资源&#xff1a; 示例项目 Qut…

linux 7启动文件夹在哪里设置密码,RHEL7 or CentOS7 的系统密码如何重置

导读RHEL7 的世界发生了变化&#xff0c;重置 root 密码的方式也一样。虽然中断引导过程的旧方法(init/bin/bash)仍然有效&#xff0c;但它不再是推荐的。“Systemd” 使用 “rd.break” 来中断引导。让我们快速浏览下整个过程。介绍目的在 RHEL7/CentOS7/Scientific Linux 7 中…

里氏替换原则_代码需要有单一职责,还要开闭,里氏替换又是什么鬼?

目录单一职责原则&#xff1a;开闭原则&#xff1a;里氏替换原则&#xff1a;单一职责原则&#xff1a;每一个系统中的功能都表示一个职责&#xff0c;这些职责可以映射到模块&#xff08;类&#xff09;中&#xff0c;且尽可能的保证这些类中没有功能上的重复&#xff0c;设计…

linux bind日志级别,BIND日志相关(一)

对于排除DNS故障来说&#xff0c;日志文件是极其重要的工具&#xff0c;DNS日志可以记录服务器CPU占用时间&#xff0c;查询统计信息以及配置中存在的问题。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。BIND在默认情况下&am…

junit:junit_简而言之,JUnit:测试结构

junit:junit尽管存在有关JUnit测试的书籍和文章&#xff0c;但我仍然经常遇到程序员&#xff0c;他们至多对这个工具及其正确用法都不甚了解。 因此&#xff0c;我想到了编写多部分教程的想法&#xff0c;从我的角度解释了要点。 也许在本微型系列文章中采用的动手方法可能适合…

联想打印机7256显示更换墨盒_惠普打印机涉嫌垄断?只认自家“昂贵”墨盒,成本太高招架不住...

近日&#xff0c;有人爆料称&#xff0c;所在公司购买的惠普打印机使用原装墨盒时可正常打印&#xff0c;更换其他品牌墨盒后也不能正常使用&#xff0c;因此认为惠普公司有行业垄断的嫌疑。从细节来看&#xff0c;该公司购买了惠普同一型号但不同批次的两台打印机&#xff0c;…

linux mcelog 运行,服务器硬件检测(采用mcelog)

mt 内存监控&#xff1a;mcecheck.pyraid监控&#xff1a; check-raidmcelog 是 x86 的 Linux 系统上用来检查硬件错误&#xff0c;特别是内存和CPU错误的工具。安装方式yum install mcelog运行mcelog查看日志方式/var/log/mcelogMCE 0HARDWARE ERROR. This is NOT a software …

动手选择值

由于冠状病毒的存在&#xff0c;可选的东西在空中&#xff0c;一切都变得可选&#xff0c;例如可选的公共聚会&#xff0c;可选的在家工作&#xff0c;可选的旅行等。 我现在是时候谈论处理NULL引用的软件工程中真正的“ 可选 ”了。 托尼霍尔&#xff08;Tony Hoare&#xf…

python mysql操作_Python的MySQL操作

Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。Python DB-API使用流程:引入API模块。获取与数据库的连接。执行SQL语句和存储过程。关闭数据库连接。一、安装MySQL客户端MySQLdb 是用于Python链接Mysql数据库的接口&#x…

linux下的遥控器软件下载,Linux操作系统下遥控器的配置及使用方法

你有没有想象过能够坐在沙发上&#xff0c;或者躺在床上&#xff0c;拿着遥控器像操作电视一样来操作电脑&#xff1f;可能你已经见到过市场上出现的那种电脑遥控器&#xff0c;不过它们都是基于windows下的。其实&#xff0c;通过一定的配置&#xff0c;在linux平台上&#xf…

wincc历史数据库_WinCC系统的基本功能介绍——自动化工程师必备

写在面前前面讲解了西门子的TIA Portal Wincc, Wincc Classic和Wincc OA (一文带你了解西门子Wincc),介绍了西门子的超大型/分布式SCADA系统Wincc OA(初识西门子Wincc OA——超大型/分布式SCADA)&#xff0c;还介绍了Wincc Classic的典型架构和选型指南(WinCC V7.5典型架构及选…

apache.camel_Apache Camel 2.14中的更多指标

apache.camelApache Camel 2.14将于本月晚些时候发布。 由于正在解决某些Apache基础结构问题&#xff0c;因此存在一些问题。 这篇博客文章讨论的是我们添加到此版本中的新功能之一。 感谢Lauri Kimmel捐赠了骆驼指标组件&#xff0c;我们将其与出色的Codehale指标库集成在一起…

获取linux详细信息,Linux 获取网口详细信息

一般来说&#xff0c;研究 ifconfig.c 源代码就可以达到目的了。但是Linux已经提供了比较方便的获取网口信息的方式&#xff1a;[philipcatonbj ~]$ cat /sys/class/net/em1/statistics/rx_bytes3911191274在/sys/class/net/INTERFACE/statistics/ 目录下有所有网口的状态&…

python魔法方法str_8.9.魔法方法 - str()方法

# \_\_str\_\_()方法~~~class Car(object):"""定义了一个车类&#xff0c;可以启动和炸街"""def __init__(self, name, max_speed, vehicle_length):""" __init__() 方法&#xff0c;用来做变量初始化 或 赋值 操作""&…