2.1 创建新的项目
Quarkus应用开发的第一步是创建新的项目。Quarkus提供了两种不同的方式来创建Quarkus应用。在创建Quarkus应用之前,需要确保本地开发环境做好了相应的准备。
1 开发环境准备
在开发Quarkus应用之前,首先需要准备本地开发环境。
本地开发环境上需要安装JDK 11。可以使用任意的JDK发行版本,推荐使用AdoptOpen-JDK。为了构建原生可执行文件,还需要安装最新的GraalVM的JDK 11版本。由于GraalVM中已经包含了OpenJDK,在安装了GraalVM之后就不再需要单独安装OpenJDK,直接指向GraalVM中的OpenJDK即可。
在编写Java代码时通常都使用IDE。可以根据自己的使用习惯选择最熟悉的IDE,包括In-telliJ IDEA、Eclipse或VS Code。这三个IDE都有官方的Quarkus插件,可以帮助简化Quarkus开发。推荐使用IntelliJ IDEA社区版,不仅免费而且功能强大。
在构建工具上,可以使用Apache Maven或Gradle来构建Quarkus应用。目前Quarkus对Gradle的支持仍然是试验性的,可能存在一些问题。因此推荐使用Maven作为构建工具。Quarkus需要Maven 3.8.1及以上版本。Quarkus在创建应用的骨架代码时会自动添加Maven Wrapper的支持,可以通过Wrapper来运行Maven,并不要求在本地安装独立的Maven。
本地开发环境还需要安装Docker来运行应用所需要的支撑服务。为了部署应用到Kuber-netes,还需要一个可用的Kubernetes集群,可以在本机上安装minikube,也可以使用云平台上管理的Kubernetes集群。
在准备好开发环境之后,就可以开始创建新的Quarkus项目。下面介绍创建新的Quarkus项目的方式。
2 在线创建新项目
第一种方式是通过code.quarkus.io网站进行在线创建。这个网站的作用类似于Spring提供的start.spring.io网站。图2-1是该网站的截图。在该页面中需要提供所创建Quarkus应用的Ma-ven坐标(Coordinate),包括groupId、artifactId和version。在构建工具的选项中,可以选择Ma-ven或Gradle。最重要的配置是选择应用需要使用的Quarkus扩展。在页面上列出了全部可用的Quarkus扩展。每个扩展有相应的介绍,可以帮助了解扩展的基本功能。应用根据自身的需要来选择要添加的扩展。完成扩展的选择之后,单击“Generate your application”按钮就可以下载应用的基本代码到本机。
·图2-1 在线创建Quarkus应用
3 使用Maven插件创建新项目
第二种方式是通过Maven来创建应用。Quarkus的Maven插件提供了创建Quarkus应用的支持,只需要使用该插件的create命令即可,如下面的代码所示。在该命令中,io.quarkus:quarkus-maven-plugin:2.0.2.Final是Maven插件的坐标,通过-D传递的3个参数project-GroupId、projectArtifactId和projectVersion用来配置所创建的Maven项目的坐标。如果希望在创建时添加扩展,可以使用-Dextensions参数指定扩展的名称列表。
当上述命令运行完成之后,在当前目录中会产生一个名称与projectArtifactId的值相同的子目录,该目录中包含了自动生成的Quarkus应用的基础代码。
通过上述两种方式创建的项目可以直接导入到IDE中。除了上述两种方式之外,也可以直接使用IDE创建新的Maven项目或模块,再手动添加Quarkus相关的依赖。
4 代码组织结构介绍
通过Maven插件的create命令创建的Quarkus应用是一个简单地使用JSON格式的REST服务,使用了扩展resteasy和resteasy-jackson。下面介绍一下这个应用的代码组织结构。
该应用是一个标准的Maven项目,使用了通用的Maven项目的目录结构。该项目使用Ma-ven Wrapper来运行Maven。在构建项目时,应该优先使用mvnw命令。
整个应用中最重要的部分在POM文件。POM文件的<properties>中定义了很多配置属性,主要用来指定不同依赖的版本号。其中最重要的是配置属性quarkus.platform.version和quarkus-plugin.version,分别指定了Quarkus自身和Maven插件的版本。这两个配置属性的值需要保持一致。当希望升级Quarkus时,只需要修改这两个配置属性即可。
在下面的代码中,POM文件的<dependencyManagement>中,导入了Quarkus平台的BOM文件来提供Quarkus扩展的版本号。在声明Quarkus扩展的依赖时,只需要指定groupId和arti-factId即可,并不需要提供版本号。这样可以确保Quarkus的不同扩展之间保持兼容。
Quarkus的生态系统中有很多的扩展,包括Quarkus团队维护的核心扩展和社区贡献的其他扩展。如果某些扩展使用了同一个依赖的不同版本,在一同使用时可能出现问题。Quarkus平台是一个扩展的集合。该集合中的扩展可以一同使用而不会产生冲突。每个Quarkus平台都有对应的Maven工件来提供BOM文件,用来声明全部扩展及其第三方依赖的版本。
在Maven项目中启用了Quarkus插件,如下面的代码所示。Quarkus插件在构建时会执行三个目标,分别是build、generate-code和generate-code-tests。目标generate-code和generate-code-tests分别生成代码和测试代码。有些扩展会在构建时生成代码,比如gRPC扩展会从protobuf文件中生成Java代码。目标build用来构建Quarkus应用,在package阶段执行。
运行./mvnw package命令可以把Quarkus应用打包成JAR文件。在目录target中会生成一个JAR文件,不过该JAR文件只包含应用本身的类文件和资源文件,无法直接运行。可以执行的JAR文件是目录target/quarkus-app下的quarkus-run.jar文件。使用下面的命令可以运行应用。