quarkus_Quarkus入门
quarkus
Quarkus – 一個(gè)針對(duì)OpenJDK HotSpot和GraalVM量身定制的Kubernetes本機(jī)Java堆棧,它是從最佳Java庫(kù)和標(biāo)準(zhǔn)中精制而成的。 –是一個(gè)容器優(yōu)先的框架,針對(duì)快速啟動(dòng)時(shí)間和低內(nèi)存消耗進(jìn)行了優(yōu)化。 該框架基于許多流行的Java庫(kù)構(gòu)建,并且為構(gòu)建標(biāo)準(zhǔn)REST以及響應(yīng)式和消息驅(qū)動(dòng)型微服務(wù)提供支持。 由于快速的啟動(dòng)時(shí)間和較低的內(nèi)存使用量,Quarkus也可用于在無(wú)服務(wù)器環(huán)境中實(shí)現(xiàn)功能。 憑借統(tǒng)一的配置,出色的實(shí)時(shí)重裝功能和工具支持,Quarkus為快速開(kāi)發(fā)應(yīng)用程序提供了許多可能性。
了解如何開(kāi)始使用Quarkus和構(gòu)建PetClinic REST API。
這篇博客文章涵蓋:
- 開(kāi)發(fā)環(huán)境要求
- 建立新專(zhuān)案
- 使用Java 11開(kāi)發(fā),構(gòu)建和運(yùn)行應(yīng)用程序
- 使用Postgres和Flyway進(jìn)行數(shù)據(jù)源配置
- 分頁(yè)CRUD服務(wù)
- 創(chuàng)建集成測(cè)試
- 實(shí)時(shí)重新加載和調(diào)試
- Docker化應(yīng)用程序(本機(jī)和非本機(jī))
關(guān)于PetClinic API
我決定重新使用在本博文Spring Boot和Spring Data REST中使用的PetClinic模型。
基本上,它是用于管理虛擬PetClinic的基本CRUD服務(wù):寵物,獸醫(yī),來(lái)訪等。
先決條件
碼頭工人
Docker將用于運(yùn)行服務(wù)本身的dockerized版本,但也將用于運(yùn)行PostgreSQL服務(wù)器。
帶有GraalVM的JDK 11
PetClinic API將使用Java 11構(gòu)建,因此必須安裝JDK 11。 為了構(gòu)建本機(jī)可執(zhí)行文件,必須存在GraalVM 19.3+,并且由于它是基于OpenJDK 11構(gòu)建的,因此這將是本教程的最佳選擇。 安裝(和管理Java SDK的多個(gè)版本)最簡(jiǎn)單的方法是使用SDKMAN!
了解如何使用SDKMAN管理多個(gè)Java SDK! 輕松
要支持本機(jī)映像,請(qǐng)確保安裝所有必需的依賴(lài)項(xiàng)。 可以在GraalVM文檔中找到更多信息: https ://www.graalvm.org/docs/reference-manual/native-image/
GraalVM官方文檔: GraalVM
終奌站
該服務(wù)是使用iTerm2和oh-my-zsh在macOS上開(kāi)發(fā)的。 我還將httpie用作默認(rèn)的HTTP客戶(hù)端。
IntelliJ
我首選的IDE是IntelliJ,我在從事此項(xiàng)目時(shí)就使用了它。
在本文中了解有關(guān)我在macOS上使用的工具的更多信息: macOS:(Java)開(kāi)發(fā)人員的基本工具
使用Docker運(yùn)行PostgreSQL
該應(yīng)用程序?qū)⑦B接到Postgres服務(wù)器,并根據(jù)配置文件( dev , test , prod )應(yīng)用不同的配置。 為此,我們將需要運(yùn)行三臺(tái)服務(wù)器:每臺(tái)服務(wù)器具有不同的數(shù)據(jù)庫(kù)名稱(chēng),端口和憑據(jù)。 為了簡(jiǎn)化設(shè)置,可以利用Docker。
開(kāi)發(fā)數(shù)據(jù)庫(kù)
- 創(chuàng)建并運(yùn)行容器:
- 運(yùn)行先前停止的容器:
測(cè)試數(shù)據(jù)庫(kù)
- 創(chuàng)建并運(yùn)行容器:
- 運(yùn)行先前停止的容器:
產(chǎn)品數(shù)據(jù)庫(kù)
- 創(chuàng)建并運(yùn)行容器:
- 運(yùn)行先前停止的容器:
入門(mén)
引導(dǎo)應(yīng)用程序
您可以在命令行中使用Maven引導(dǎo)應(yīng)用程序,也可以使用在線生成器。 在線生成器允許探索可以構(gòu)成Quarkus應(yīng)用程序的擴(kuò)展和技術(shù),并且不需要本地Maven安裝。 您可以在此處訪問(wèn)生成器: https : //code.quarkus.io
需要以下擴(kuò)展來(lái)構(gòu)建PetClinic API服務(wù):
- RESTEasy JAX-RS –實(shí)現(xiàn)JAX-RS等的REST框架
- RESTEasy Jackson –對(duì)RESTEasy的Jackson序列化支持
- SmallRye OpenAPI –使用OpenAPI記錄您的REST API – Swagger UI隨附
- 帶有Panache的Hibernate ORM –在帶有Panache的Hibernate ORM中定義持久性模型
- Hibernate Validator –驗(yàn)證進(jìn)入您的REST端點(diǎn)的數(shù)據(jù)
- JDBC驅(qū)動(dòng)程序– PostgreSQL – PostgreSQL數(shù)據(jù)庫(kù)連接器
- Flyway –處理數(shù)據(jù)庫(kù)架構(gòu)遷移
選擇依賴(lài)項(xiàng)后,您可以下載zip,解壓縮并開(kāi)始開(kāi)發(fā)服務(wù)。
下載的項(xiàng)目具有標(biāo)準(zhǔn)的Maven項(xiàng)目布局。 它包含Maven包裝器,因此無(wú)需本地Maven安裝即可開(kāi)發(fā)項(xiàng)目。 您還會(huì)注意到src/main/docker帶有本機(jī)和JVM映像的Docker文件。
主配置文件application.properties位于src/main/resources 。 此文件夾還包含META-INF/resources文件夾,用于存儲(chǔ)應(yīng)用程序的靜態(tài)資源,例如index.html文件。
在
在線生成器默認(rèn)情況下使用Java 8生成項(xiàng)目,因此要使用Java 11,需要進(jìn)行一些調(diào)整。
- 在生成的項(xiàng)目的pom.xml中,更改Java版本:
- 在src/main/docker/Dockerfile.jvm設(shè)置ARG JAVA_PACKAGE=java-11-openjdk-headless
在開(kāi)發(fā)模式下運(yùn)行項(xiàng)目
進(jìn)行更改后,您可以啟動(dòng)應(yīng)用程序。 打開(kāi)終端,導(dǎo)航到項(xiàng)目的文件夾并運(yùn)行以下命令:
$ ./mvnw compile quarkus:dev注意:Quarkus具有三種內(nèi)置模式: dev , test和prod取決于您如何運(yùn)行應(yīng)用程序。
在IntelliJ中開(kāi)發(fā)
在IntelliJ中,您只需打開(kāi)項(xiàng)目的文件夾或pom.xml 。 ( File > Open )。 該項(xiàng)目只能使用Maven啟動(dòng)。 這可以通過(guò)Maven運(yùn)行配置來(lái)完成,因?yàn)闆](méi)有主類(lèi)可以啟動(dòng)應(yīng)用程序,例如在Spring Boot中 。
對(duì)我來(lái)說(shuō),使用Quarkus進(jìn)行開(kāi)發(fā)時(shí)最好的體驗(yàn)是當(dāng)我在IntelliJ外部的終端中運(yùn)行應(yīng)用程序時(shí)。
調(diào)試
在開(kāi)發(fā)模式下執(zhí)行Quarkus應(yīng)用程序時(shí),它將以啟用的調(diào)試協(xié)議(在端口5005上)啟動(dòng)。 要在IntelliJ中調(diào)試Quarkus應(yīng)用程序,您需要通過(guò)Run > Attach to Process調(diào)試器附加到正在Run > Attach to Process 。 我沒(méi)有調(diào)試應(yīng)用程序的麻煩。
注意:可以在禁用調(diào)試的開(kāi)發(fā)模式下運(yùn)行該應(yīng)用程序: ./mvnw quarkus:dev -Ddebug=false ,但老實(shí)說(shuō),默認(rèn)情況下啟用調(diào)試器時(shí),我沒(méi)有發(fā)現(xiàn)任何性能問(wèn)題。
實(shí)時(shí)重載
我認(rèn)為,實(shí)時(shí)重新加載是Quarkus最強(qiáng)大的功能。 效果驚人。 基本上,您可以更改源代碼中所需的任何內(nèi)容,執(zhí)行請(qǐng)求,然后眨眼間即可重新加載應(yīng)用程序。 我正在重新整理類(lèi)和程序包,移動(dòng)文件,添加和刪除端點(diǎn),而所有這些操作都沒(méi)有一次重啟。
數(shù)據(jù)源配置
所有屬性都轉(zhuǎn)到src/main/resources/application.properties 。
默認(rèn)數(shù)據(jù)源屬性(
quarkus.datasource.url=jdbc:postgresql: //localhost:5432/petclinic quarkus.datasource.driver=org.postgresql.Driver quarkus.datasource.username=petclinic quarkus.datasource.password=petclinicDev數(shù)據(jù)源屬性(
要設(shè)置模式(或配置文件)的特定屬性,請(qǐng)使用%mode :
%dev.quarkus.datasource.url=jdbc:postgresql: //localhost:5433/petclinic-dev %dev.quarkus.datasource.username=petclinic-dev %dev.quarkus.datasource.password=petclinic-dev測(cè)試數(shù)據(jù)源屬性(
%test.quarkus.datasource.url=jdbc:postgresql: //localhost:5434/petclinic-test %test.quarkus.datasource.username=petclinic-test %test.quarkus.datasource.password=petclinic-test另請(qǐng)參閱: https : //quarkus.io/guides/datasource
飛路遷移
要使用Flyway,請(qǐng)?jiān)趕rc/main/resources創(chuàng)建db/migration文件夾,然后添加遷移文件。 我的第一個(gè)遷移文件稱(chēng)為V1.0.0__PetClinic.sql ,其中包含該服務(wù)的所有架構(gòu)(DDL)和示例數(shù)據(jù)。
注意:Quarkus支持SQL導(dǎo)入,可以通過(guò)quarkus.hibernate-orm.sql-load-script為每個(gè)配置文件配置SQL導(dǎo)入,但是我無(wú)法使其工作。 請(qǐng)參閱我在Github上報(bào)告的問(wèn)題: https : //github.com/quarkusio/quarkus/issues/7358
另請(qǐng)參閱: https : //quarkus.io/guides/flyway
JPA實(shí)體
PetClinic的域模型相對(duì)簡(jiǎn)單,但是它包含一些單向和雙向關(guān)聯(lián)以及基本繼承,這使其比簡(jiǎn)單的Hello World類(lèi)型的模型要好一些。
請(qǐng)注意,在此示例中,JPA實(shí)體由相應(yīng)的Panache存儲(chǔ)庫(kù)直接在JAX-RS資源中返回(請(qǐng)參見(jiàn)下文),因此,實(shí)體類(lèi)包含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; }所有實(shí)體都位于pl.codeleak.samples.petclinic.model包中。
HibernateORM與Panache
如果您熟悉Spring,我想您已經(jīng)聽(tīng)說(shuō)過(guò)Spring Data項(xiàng)目。 在我看來(lái), 帶有Panache的Hibernate ORM具有相似的目標(biāo):通過(guò)消除重復(fù)和繁瑣的工作,簡(jiǎn)化了JPA的開(kāi)發(fā)。 Panache支持排序,分頁(yè), java.util.Optional和java.utitl.stream.Stream等。
你有兩種方法來(lái)工作,以耀目:與創(chuàng)建實(shí)體PanacheEntity或創(chuàng)建庫(kù)PanacheRepository 。 我在這個(gè)項(xiàng)目中嘗試了兩種方法,但是由于實(shí)體中的繼承問(wèn)題,我決定堅(jiān)持使用老式的方法。
帶有Panache的Hibernate ORM的基本存儲(chǔ)庫(kù)定義:
public class OwnerRepository implements PanacheRepository<Owner> { List<Owner> findByLastName(String lastName) { return list( "lastName" , lastName); } }所有存儲(chǔ)庫(kù)都位于pl.codeleak.samples.petclinic.repository包中。
另請(qǐng)參閱: https : //quarkus.io/guides/hibernate-orm-panache
創(chuàng)建REST API
JAX-RS資源
Quarkus使用帶有RESTEasy的JAX-RS。 要?jiǎng)?chuàng)建API端點(diǎn),我們需要?jiǎng)?chuàng)建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) { ????} }依賴(lài)注入是通過(guò)CDI完成的-上下文和依賴(lài)注入 。 資源對(duì)象將由Quarkus自動(dòng)配置。 必須將所有其他依賴(lài)項(xiàng)配置為具有CDI批注的依賴(lài)項(xiàng)注入。
例如,可以使用@ApplicationScoped注釋存儲(chǔ)庫(kù),然后使用@Inject注入存儲(chǔ)庫(kù):
@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包中。
另請(qǐng)參閱: https : //quarkus.io/guides/cdi-reference
分頁(yè)
如前所述,Panache為分頁(yè)結(jié)果提供支持。 我們可以輕松地在我們的資源中輕松利用它:
@GET public Response getAll( @BeanParam PageRequest pageRequest) { return Response.ok(((PanacheRepository) petRepository).findAll() .page(Page.of(pageRequest.getPageNum(), pageRequest.getPageSize())) .list()).build(); }PageRequest是一個(gè)包含pageNum和pageSize查詢(xún)參數(shù)的bean:
public class PageRequest { @QueryParam ( "pageNum" ) @DefaultValue ( "0" ) private int pageNum; @QueryParam ( "pageSize" ) @DefaultValue ( "10" ) private int pageSize; }使用httpie可以輕松完成分頁(yè)請(qǐng)求:
$ 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" } ]交易次數(shù)
在JPA中創(chuàng)建新對(duì)象需要活動(dòng)事務(wù)。 為了將事務(wù)綁定到資源對(duì)象中的當(dāng)前方法,請(qǐng)使用@Transactional ,否則在方法執(zhí)行期間將引發(fā)異常:
@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創(chuàng)建新資源:
$ 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驗(yàn)證方式
該項(xiàng)目使用Hibernate Validator擴(kuò)展。 通過(guò)此擴(kuò)展,您可以使用標(biāo)準(zhǔn)的Hibernate驗(yàn)證批注(例如@NotBlank ),并且當(dāng)資源方法的輸入?yún)?shù)使用@Valid注釋時(shí),驗(yàn)證將自動(dòng)觸發(fā),并且錯(cuò)誤響應(yīng)將返回給調(diào)用該方法的客戶(hù)端。
以下請(qǐng)求的示例響應(yīng):
$ 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" : [] }關(guān)于實(shí)時(shí)重新加載功能的注意事項(xiàng):您可以對(duì)源代碼進(jìn)行任何更改,并使用httpie執(zhí)行新請(qǐng)求。 該應(yīng)用程序快速重新加載,您會(huì)立即獲得結(jié)果。 無(wú)需重新啟動(dòng)。
另請(qǐng)參閱: https : //quarkus.io/guides/validation
Java 8日期和時(shí)間支持
RESTEasy Jackson擴(kuò)展位于項(xiàng)目中時(shí),在JSON序列化和反序列化期間支持java.util.time類(lèi)型。
在以下示例中,訪問(wèn)日期以@JsonFormat批注提供的格式進(jìn)行序列化和反序列化:
@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" } }您還可以使用所需的日期時(shí)間格式將訪問(wèn)存儲(chǔ)在請(qǐng)求正文中:
$ 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/1042OpenAPI / Swagger支持
SmallRye OpenAPI擴(kuò)展負(fù)責(zé)提供API文檔,并且在開(kāi)發(fā)模式下啟用了SwaggerUI。
默認(rèn)端點(diǎn)是:
- OpenAPI文檔– /openapi
- SwaggerUI – /swaggerui
另請(qǐng)參閱: https : //quarkus.io/guides/openapi-swaggerui
整合測(cè)試
Quarkus使用JUnit 5和RESTAssured進(jìn)行集成測(cè)試。 可以使用@QuarkusTest批注創(chuàng)建test ,并且默認(rèn)情況下會(huì)在激活test配置文件的情況下執(zhí)行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測(cè)試要求應(yīng)用程序正在運(yùn)行。 通過(guò)使用CDI @Alternate bean定義,可以替換測(cè)試中的選定bean。 備用bean必須放置在src/test/java 。
注意:由于有了配置文件支持,您可以使用單獨(dú)的數(shù)據(jù)庫(kù)容器輕松配置test配置文件的數(shù)據(jù)源。 請(qǐng)參閱測(cè)試數(shù)據(jù)源屬性 。
另請(qǐng)參閱: https : //quarkus.io/guides/getting-started-testing
打包并運(yùn)行應(yīng)用程序
該應(yīng)用程序可以打包為./mvnw package 。
它在/target目錄中生成可執(zhí)行文件quarkus-petclinic-api-1.0.0-runner.jar文件,并將依賴(lài)項(xiàng)復(fù)制到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] ------------------------------------------------------------------------現(xiàn)在可以使用java -jar target/quarkus-petclinic-api-1.0.0-runner.jar運(yùn)行該應(yīng)用程序。
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一起打包。
創(chuàng)建一個(gè)以JVM模式運(yùn)行應(yīng)用程序的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使用鏈接運(yùn)行容器,執(zhí)行Postgres數(shù)據(jù)庫(kù)容器,并使用環(huán)境變量覆蓋數(shù)據(jù)源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是在此處創(chuàng)建的Postgres容器的名稱(chēng): Prod database 。 我們還需要傳遞數(shù)據(jù)源URL。 閱讀有關(guān)在運(yùn)行時(shí)覆蓋配置屬性的更多信息:在運(yùn)行時(shí)覆蓋屬性
創(chuàng)建本機(jī)可執(zhí)行文件
您可以使用以下命令創(chuàng)建本機(jī)可執(zhí)行文件:
$ ./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] ------------------------------------------------------------------------創(chuàng)建本機(jī)可執(zhí)行文件的過(guò)程需要花費(fèi)一些時(shí)間,但是值得等待它完成以查看應(yīng)用程序的啟動(dòng)時(shí)間:
$ ./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]本機(jī)可執(zhí)行文件啟動(dòng)為0.67秒,而JVM版本為2秒。
創(chuàng)建一個(gè)以純模式運(yùn)行應(yīng)用程序的Docker容器
默認(rèn)情況下,本機(jī)可執(zhí)行文件以操作系統(tǒng)支持的格式創(chuàng)建。 由于容器使用的可執(zhí)行文件格式可能與操作系統(tǒng)生成的格式不同,因此Maven構(gòu)建可以從容器內(nèi)部生成可執(zhí)行文件:
$ ./mvnw package -Pnative -Dquarkus. native .container-build= true要調(diào)整構(gòu)建器映像的版本,您需要設(shè)置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現(xiàn)在,構(gòu)建并運(yùn)行容器:
$ docker build -f src/main/docker/Dockerfile. native -t quarkus/petclinic-api . $ docker run -i --rm -p 8080 : 8080 quarkus/petclinic-api注意:有關(guān)構(gòu)建本機(jī)可執(zhí)行文件的更多信息,請(qǐng)參見(jiàn)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
quarkus
總結(jié)
以上是生活随笔為你收集整理的quarkus_Quarkus入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: aws 数据库迁移_AWS Loft的数
- 下一篇: 怎么建立电商平台(如何做一个自己的电商平