先决条件
- 一个IDE
- JDK 8或11+
- Apache Maven 3.6.2+
创建项目
`Linux和MacOS用户:`
`mvn io.quarkus:quarkus-maven-plugin:1.13.2.Final:create \`
`-DprojectGroupId=org.acme \`
`-DprojectArtifactId=getting-started \`
`-DclassName="org.acme.getting.started.GreetingResource" \`
`-Dpath="/hello"`
`Windows用户:`
`mvn io.quarkus:quarkus-maven-plugin:1.13.2.Final:create -DprojectGroupId=org.acme -DprojectArtifactId=getting-started -DclassName="org.acme.getting.started.GreetingResource" -Dpath="/hello"`
生成以下内容 ./getting-started:
- Maven结构
- org.acme.getting.started.GreetingResource暴露于的资源/hello
- 相关的单元测试
- http://localhost:8080启动应用程序后可访问的登录页面
- 和中的模式的示例Dockerfile文件nativejvmsrc/main/docker
- 应用程序配置文件
查看pom.xml。您将找到Quarkus BOM的导入,从而可以省略不同Quarkus依赖项上的版本。此外,您还可以看到quarkus-maven-plugin负责应用程序打包的人员,还可以提供开发模式
`<dependencyManagement>`
`<dependencies>`
`<dependency>`
`<groupId>io.quarkus</groupId>`
`<artifactId>quarkus-universe-bom</artifactId>`
`<version>${quarkus.platform.version}</version>`
`<type>pom</type>`
`<scope>import</scope>`
`</dependency>`
`</dependencies>`
`</dependencyManagement>`
`<build>`
`<plugins>`
`<plugin>`
`<groupId>io.quarkus</groupId>`
`<artifactId>quarkus-maven-plugin</artifactId>`
`<version>${quarkus-plugin.version}</version>`
`<extensions>true</extensions>`
`<executions>`
`<execution>`
`<goals>`
`<goal>build</goal>`
`<goal>generate-code</goal>`
`<goal>generate-code-tests</goal>`
`</goals>`
`</execution>`
`</executions>`
`</plugin>`
`</plugins>`
`</build>`
可以看到开发REST应用程序:
`<dependency>`
`<groupId>io.quarkus</groupId>`
`<artifactId>quarkus-resteasy</artifactId>`
`</dependency>`
JAX-RS资源
一个非常简单的REST端点,向“ / hello”上的请求返回“ hello”
`package org.acme.getting.started;`
`import javax.ws.rs.GET;`
`import javax.ws.rs.Path;`
`import javax.ws.rs.Produces;`
`import javax.ws.rs.core.MediaType;`
`@Path("/hello")`
`public class GreetingResource {`
`@GET`
`@Produces(MediaType.TEXT_PLAIN)`
`public String hello() {`
`return "hello";`
`}`
`}`
使用Quarkus,无需创建Application类。它受支持,但不是必需的。另外,仅创建资源的一个实例,而不为每个请求创建一个。您可以使用不同的配置此*Scoped批注(ApplicationScoped,RequestScoped,等)。
运行应用程序
现在,我们准备运行我们的应用程序。使用方法./mvnw compile quarkus:dev:
`$ ./mvnw compile quarkus:dev`
`[INFO] --------------------< org.acme:getting-started >---------------------`
`[INFO] Building getting-started 1.0.0-SNAPSHOT`
`[INFO] --------------------------------[ jar ]---------------------------------`
`[INFO]`
`[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ getting-started ---`
`[INFO] Using 'UTF-8' encoding to copy filtered resources.`
`[INFO] skip non existing resourceDirectory /Users/starksm/Dev/JBoss/Quarkus/starksm64-quarkus-quickstarts/getting-started/src/main/resources`
`[INFO]`
`[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ getting-started ---`
`[INFO] Changes detected - recompiling the module!`
`[INFO] Compiling 2 source files to /Users/starksm/Dev/JBoss/Quarkus/starksm64-quarkus-quickstarts/getting-started/target/classes`
`[INFO]`
`[INFO] --- quarkus-maven-plugin:<version>:dev (default-cli) @ getting-started ---`
`Listening for transport dt_socket at address: 5005`
`2019-02-28 17:05:22,347 INFO [io.qua.dep.QuarkusAugmentor] (main) Beginning quarkus augmentation`
`2019-02-28 17:05:22,635 INFO [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 288ms`
`2019-02-28 17:05:22,770 INFO [io.quarkus] (main) Quarkus started in 0.668s. Listening on: http://localhost:8080`
`2019-02-28 17:05:22,771 INFO [io.quarkus] (main) Installed features: [cdi, resteasy]`
curl -w "\n" http://localhost:8080/hello
hello
使用 注入
=====
Quarkus中的依赖注入基于ArC,ArC是为Quarkus架构量身定制的基于CDI的依赖注入解决方案。如果您不熟悉CDI,建议您阅读CDI简介指南。
Quarkus仅实现CDI功能的一个子集,并具有非标准功能和特定的APIS,您可以在Contexts and Dependency Injection指南中了解有关它的更多信息。
ArC作为的依赖项,quarkus-resteasy因此您已经很方便了。
package org.acme.getting.started;
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "hello " + name;
}
}
`编辑GreetingResource该类以注入,GreetingService并使用它创建一个新的端点:package org.acme.getting.started;`
`import javax.inject.Inject;`
`import javax.ws.rs.GET;`
`import javax.ws.rs.Path;`
`import javax.ws.rs.Produces;`
`import javax.ws.rs.core.MediaType;`
`import org.jboss.resteasy.annotations.jaxrs.PathParam;`
`@Path("/hello")`
`public class GreetingResource {`
`@Inject`
`GreetingService service;`
`@GET`
`@Produces(MediaType.TEXT_PLAIN)`
`@Path("/greeting/{name}")`
`public String greeting(@PathParam String name) {`
`return service.greeting(name);`
`}`
`@GET`
`@Produces(MediaType.TEXT_PLAIN)`
`public String hello() {`
`return "hello";`
`}`
`}`
```
编辑GreetingResource该类以注入,GreetingService并使用它创建一个新的端点:
开发模式
====
quarkus:dev在开发模式下运行Quarkus。这样可以通过后台编译实现热部署,这意味着当您修改Java文件和/或资源文件并刷新浏览器时,这些更改将自动生效。这对于资源文件(如配置属性文件)也适用。刷新浏览器会触发对工作区的扫描,如果检测到任何更改,将重新编译Java文件并重新部署应用程序;然后,重新部署的应用程序将为您的请求提供服务。如果编译或部署有任何问题,则会显示错误页面。
这还将在port上侦听调试器5005。如果要在运行之前等待调试器附加,可以\-Dsuspend在命令行中传递。如果您根本不想使用调试器,则可以使用\-Ddebug=false。
![下一代云原生-第一个Quarkus应用程序](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d77d29f114d04e6c8d5a0cbac4fe272d~tplv-k3u1fbpfcp-zoom-1.image)
测试
==
在生成的pom.xml文件中,您可以看到2个测试依赖项:
```
`<dependency>`
`<groupId>io.quarkus</groupId>`
`<artifactId>quarkus-junit5</artifactId>`
`<scope>test</scope>`
`</dependency>`
`<dependency>`
`<groupId>io.rest-assured</groupId>`
`<artifactId>rest-assured</artifactId>`
`<scope>test</scope>`
`</dependency>`
```
Quarkus支持Junit 5测试。因此,必须设置Surefire Maven插件的版本,因为默认版本不支持Junit 5:
```
`<plugin>`
`<artifactId>maven-surefire-plugin</artifactId>`
`<version>${surefire-plugin.version}</version>`
`<configuration>`
`<systemPropertyVariables>`
`<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>`
`<maven.home>${maven.home}</maven.home>`
`</systemPropertyVariables>`
`</configuration>`
`</plugin>`
```
我们还设置了java.util.logging系统属性,以确保测试将使用正确的logmanager,并maven.home确保${maven.home}/conf/settings.xml应用了from的自定义配置(如果有)。
生成的项目包含一个简单的测试。编辑
src/test/java/org/acme/getting/started/GreetingResourceTest.java以匹配以下内容:
```
`package org.acme.getting.started;`
`import io.quarkus.test.junit.QuarkusTest;`
`import org.junit.jupiter.api.Test;`
`import java.util.UUID;`
`import static io.restassured.RestAssured.given;`
`import static org.hamcrest.CoreMatchers.is;`
`@QuarkusTest`
`public class GreetingResourceTest {`
`@Test`
`public void testHelloEndpoint() {`
`given()`
`.when().get("/hello")`
`.then()`
`.statusCode(200)`
`.body(is("hello"));`
`}`
`@Test`
`public void testGreetingEndpoint() {`
`String uuid = UUID.randomUUID().toString();`
`given()`
`.pathParam("name", uuid)`
`.when().get("/hello/greeting/{name}")`
`.then()`
`.statusCode(200)`
`.body(is("hello " + uuid));`
`}`
`}`
```
* 通过使用运行QuarkusTest程序,您可以指示JUnit在测试之前启动应用程序。
* 检查HTTP响应状态代码和内容
可以使用Maven运行这些:
```
./mvnw test
```
打包并运行应用程序
=========
该应用程序使用打包./mvnw package。它产生以下几个输出/target:
* getting-started-1.0.0-SNAPSHOT.jar\-仅包含项目的类和资源,这是Maven构建产生的常规工件-它**不是**可运行的jar;
* quarkus-app包含quarkus-run.jarjar文件的目录-是可执行_jar_。请注意,这不是_über-jar,_因为依赖项已复制到的子目录中quarkus-app/lib/。
您可以使用以下命令运行该应用程序: java -jar
target/quarkus-app/quarkus-run.jar
如果要将应用程序部署到某个地方(通常在容器中),则需要部署整个quarkus-app目录。
使用fast-jar
==========
假定quarkus.package.type未明确配置配置属性,或者已将其设置为legacy-jar(在application.properties或任何其他受支持的配置源中)。当属性设置fast-jar为时(将在Quarkus 1.12中使用),执行的结果 ./mvnw package是targetnamed下的新目录quarkus-app。
您可以使用来运行该应用程序java -jar
target/quarkus-app/quarkus-run.jar。
* 为了成功运行产生的jar,您需要具有quarkus-app目录的全部内容。如果缺少任何文件,则该应用程序将无法启动或无法正常运行。
* 该fast-jar包装导致创建启动快一点,消耗略少的内存比遗留Quarkus罐子,因为它有哪些相关性JAR包含的类和资源索引信息,神器。因此,在加载类或资源时,它可以避免在旧版jar必需的类路径上查找潜在的每个jar。
配置标语
====
默认情况下,当Quarkus应用程序启动时(在常规或开发模式下),它将显示ASCII技术标语。横幅可以通过设置被禁用quarkus.banner.enabled=false的application.properties,通过设置\-Dquarkus.banner.enabled=falseJava系统属性,或通过设置QUARKUS\_BANNER\_ENABLED环境变量false。此外,用户可以通过将标语文件放置在中src/main/resources并quarkus.banner.path=name-of-file在中进行配置来提供自定义标语application.properties。