先决条件
- 一个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。
测试
在生成的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。