使用 Apache Maven 开发并编译 Quarkus 应用程序
前言
作为应用程序开发人员,您可以使用红帽构建的 Quarkus 来创建在 OpenShift 和无服务器环境中运行的 Java 编写的基于微服务的应用程序。编译到原生可执行文件的应用程序会占用较少的内存占用空间和快速启动时间。
本指南论述了如何使用 Apache Maven 插件创建 Quarkus 项目。
先决条件
已安装 OpenJDK (JDK) 11,并且
JAVA_HOME
环境变量指定 Java SDK 的位置。- 登录到红帽客户门户网站,从 Software Downloads 页面下载 Red Hat Open JDK 版本。
已安装 Apache Maven 3.6.2 或更高版本。
对红帽文档提供反馈
我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。
您必须有一个红帽帐户并登录到客户门户网站。
要从客户门户网站提交文档反馈,请执行以下操作:
- 选择 Multi-page HTML 格式。
- 点文档右上角的 反馈 按钮。
- 突出显示您要提供反馈的文本部分。
- 点高亮文本旁的添加反馈对话框。
- 在页面右侧的文本框中输入您的反馈,然后单击 Submit。
每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。
感谢您的宝贵反馈。
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 Red Hat build of Quarkus
Red Hat build of Quarkus 是一个 Kubernetes 原生 Java 堆栈,用于容器和 Red Hat OpenShift Container Platform。Quarkus 旨在处理流行的 Java 标准、框架和库,如 Eclipse MicroProfile、Apache Kafka、RESTEee (DSL-RS)、Hibernate ORM (DSL)、Spring、Infinila 和 Apache Camel。
Quarkus 依赖项注入解决方案基于 CDI (上下文和依赖项注入),它包含一个扩展框架来扩展功能并配置、启动并将框架集成到应用程序中。
Quarkus 提供了构建 Java 应用程序的容器优先方法。这种方法可以更轻松地构建使用 Java 编写的基于微服务的应用程序,并使这些应用程序能够调用在无服务器计算框架上运行的功能。因此,Quarkus 应用程序有较小的内存占用空间和快速启动时间。
第 2 章 Apache Maven 和 Quarkus
Apache Maven 是 Java 应用程序开发中使用的分布式构建自动化工具,用于创建、管理和构建软件项目。Maven 使用名为 Project Object Model(POM)文件的标准配置文件来定义项目并管理构建流程。POM 文件描述了使用 XML 文件生成项目打包和输出的模块和组件依赖项、构建顺序和目标。这可确保以正确、一致的方式构建项目。
Maven 存储库
Maven 存储库存储 Java 库、插件和其他构建构件。默认公共存储库是 Maven 2 Central Repository,但存储库可以是私有的和内部存储库,以在开发团队之间共享通用工件。也可从第三方获取存储库。
您可以将在线 Maven 存储库与 Quarkus 项目搭配使用,也可以下载 Red Hat build of Quarkus Maven 存储库。
Maven 插件
Maven 插件定义 POM 文件的一部分,该文件可以达到一个或多个目标。Quarkus 应用程序使用以下 Maven 插件:
-
Quarkus Maven 插件(
quarkus-maven-plugin
):启用 Maven 创建 Quarkus 项目,支持生成 uber-JAR 文件,并提供开发模式。 -
Maven Surefire 插件(
maven-surefire-plugin
):在构建生命周期阶段使用,以便在应用程序上执行单元测试。插件生成包含测试报告的文本和 XML 文件。
2.1. 为在线存储库配置 Maven settings.xml
文件
您可以通过配置用户 settings.xml
文件,将在线 Quarkus 存储库用于 Quarkus Maven 项目。这是推荐的方法。与共享服务器上的存储库管理器或存储库一起使用的 Maven 设置提供更好的控制和领导项目。
当您通过修改 Maven settings.xml
文件来配置存储库时,更改会应用到所有 Maven 项目。
流程
在文本编辑器中打开 Maven
~/.m2/settings.xml
文件或集成开发环境(IDE)。注意如果
~/.m2/
目录中没有settings.xml
文件,请将$MAVEN_HOME/.m2/conf/
目录中的settings.xml
文件复制到~/.m2/
目录中。在
settings.xml
文件的<profiles
> 元素中添加以下行:<!-- Configure the Quarkus Maven repository --> <profile> <id>red-hat-enterprise-maven-repository</id> <repositories> <repository> <id>red-hat-enterprise-maven-repository</id> <url>https://maven.repository.redhat.com/ga/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>red-hat-enterprise-maven-repository</id> <url>https://maven.repository.redhat.com/ga/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile>
将以下行添加到
settings.xml
文件的 <activeProfiles
> 元素中,并保存文件。<activeProfile>red-hat-enterprise-maven-repository</activeProfile>
2.2. 下载并配置 Quarkus Maven 存储库
如果您不想使用在线 Maven 存储库,您可以下载并配置 Quarkus Maven 存储库,以使用 Maven 创建 Quarkus 应用程序。Quarkus Maven 存储库包含 Java 开发人员通常用于构建应用程序的许多要求。此流程描述了如何编辑 settings.xml
文件来配置 Quarkus Maven 存储库。
当您通过修改 Maven settings.xml
文件来配置存储库时,更改会应用到所有 Maven 项目。
流程
- 从红帽客户门户的 软件下载 页面下载 Quarkus Maven 存储库 ZIP 文件(需要登录)。
- 展开下载的存档。
-
将目录更改为
~/.m2/
目录,并在文本编辑器或集成开发环境(IDE)中打开 Mavensettings.xml
文件。 将您下载的 Quarkus Maven 存储库的路径添加到
settings.xml
文件的<profiles
> 元素中。Quarkus Maven 存储库的路径格式为file://$PATH
,例如file:///home/userX/rh-quarkus-1.11.7.GA-maven-repository/maven-repository
/maven-repository。<!-- Configure the Quarkus Maven repository --> <profile> <id>red-hat-enterprise-maven-repository</id> <repositories> <repository> <id>red-hat-enterprise-maven-repository</id> <url>file:///path/to/Quarkus/Maven/repository/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>red-hat-enterprise-maven-repository</id> <url>file:///path/to/Quarkus/Maven/repository/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile>
将以下行添加到
settings.xml
文件的 <activeProfiles
> 元素中,并保存文件。<activeProfile>red-hat-enterprise-maven-repository</activeProfile>
如果您的 Maven 存储库包含过时的工件,您可能会在构建或部署项目时遇到以下 Maven 错误消息之一,其中 < artifact_name>
; 是缺少的工件的名称,< ;project_name
> 是您要构建的项目的名称:
-
缺少工件 <project_name>
-
[ERROR] Failed to execute targets on project <artifact_name>; Could not resolve dependencies for <project_name>
要解决这个问题,请删除 ~/.m2/repository
目录中的本地存储库的缓存版本,以强制下载最新的 Maven 工件。
第 3 章 在命令行中创建 Quarkus 项目
您可以在命令行中使用 Quarkus Maven 插件来创建 Quarkus 项目,方法是在命令行中提供属性和值,或者在交互模式中使用插件来创建 Quarkus 项目。生成的项目将包含以下元素:
- Maven 结构
- 关联的单元测试
-
启动应用程序后可在
http://localhost:8080
上访问登录页面 -
src/main/docker
中 JVM 和原生模式的Dockerfile
文件示例 - 应用程序配置文件
流程
在命令终端中,输入以下命令验证 Maven 是否使用 JDK 11,并且 Maven 版本是否为 3.6.2 或更高版本:
mvn --version
- 如果上述命令没有返回 JDK 11,请将 JDK 11 的路径添加到 PATH 环境变量中,然后再次输入上述命令。
要使用 Quarkus Maven 插件创建新项目,请使用以下方法之一:
使用以下命令:
mvn io.quarkus:quarkus-maven-plugin:1.11.7.Final-redhat-00009:create \ -DprojectGroupId=<project_group_id> \ -DprojectArtifactId=<project_artifact_id> \ -DplatformGroupId=com.redhat.quarkus \ -DplatformArtifactId=quarkus-universe-bom \ -DplatformVersion=1.11.7.Final-redhat-00009 \ -DclassName="<classname>"
在这个命令中,替换以下值:
-
<project_group_id
> :项目的唯一标识符 -
<project_artifact_id
> :项目名称和项目目录 -
<classname
> :生成的资源的完全限定名称,如org.acme.quarkus.sample.HelloResource
-
以互动模式创建项目:
mvn io.quarkus:quarkus-maven-plugin:1.11.7.Final-redhat-00009:create
出现提示时,输入所需的属性值。
注意另外,您可以使用以下命令使用项目属性的默认值创建项目:
mvn io.quarkus:quarkus-maven-plugin:1.11.7.Final-redhat-00009:create -B
下表列出了您可以使用
create
命令定义的属性:属性 默认值 描述 projectGroupId
org.acme.sample
项目的唯一标识符。
projectArtifactId
none
项目的名称和项目目录。如果没有指定
projectArtifactId
,Maven 插件将启动交互模式。如果目录已存在,则生成会失败。projectVersion
1.0-SNAPSHOT
项目的版本。
platformGroupId
io.quarkus
平台的组 ID。所有现有的平台都由
io.quarkus
提供。但是,您可以更改默认值。platformArtifactId
quarkus-universe-bom
平台 BOM 的工件 ID。要使用本地构建的 Quarkus 将
quarkus-universe-bom
添加到pom.xml
文件中。platformVersion
最新平台版本
要用于项目的平台版本。您可以提供一个版本范围,Maven 插件使用最新版本。
className
None
生成的资源的完全限定名称。创建应用程序后,REST 端点通过以下 URL 公开:
http://localhost:8080/$path
如果您使用默认
路径
,URL 为http://localhost:8080/hello
。path
/hello
资源路径,只有在设置了
className
时。extensions
[]
要添加到用逗号分开的项目中的扩展列表。
默认情况下,Quarkus Maven 插件使用最新的 quarkus-universe-bom
文件。此 BOM 聚合扩展,以便您可以从应用程序引用它们,使其与依赖项版本保持一致。如果您离线,则 Quarkus Maven 插件将使用 quarkus-universe-bom
的最新可用版本。如果 Maven 找到 quarkus-universe-bom
版本 2.0 或更早版本,它将根据 quarkus-universe-bom
版本使用平台。
第 4 章 通过配置 pom.xml
文件来创建 Quarkus 项目
您可以通过配置 Maven POM XML 文件来创建 Quarkus 项目。
流程
-
在文本编辑器中打开
pom.xml
文件。 添加包含以下内容的配置属性:
- Quarkus Maven 插件的版本
-
Quarkus BOM 的
groupID
、artifactID
和版本
- Maven Surefire 插件的版本
<properties> <quarkus-plugin.version>1.11.7.Final-redhat-00009</quarkus-plugin.version> <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> <quarkus.platform.group-id>com.redhat.quarkus</quarkus.platform.group-id> <quarkus.platform.version>1.11.7.Final-redhat-00009</quarkus.platform.version> <surefire-plugin.version>3.0.0-M5</surefire-plugin.version> </properties>
添加 Quarkus GAV (组、工件、版本),并使用
quarkus-universe-bom
文件省略不同 Quarkus 依赖项的版本:<dependencyManagement> <dependencies> <dependency> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>${quarkus.platform.artifact-id}</artifactId> <version>${quarkus.platform.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
添加 Quarkus Maven 插件:
<build> <plugins> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.platform.version}</version> <executions> <execution> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
可选: 要构建原生应用程序,请添加包括 Maven Surefire 和 Maven Failsafe 插件的特定原生配置集,并启用
原生
软件包类型:<profiles> <profile> <id>native</id> <properties> <quarkus.package.type>native</quarkus.package.type> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>${surefire-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <systemProperties> <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> </systemProperties> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
在其名称中包含
IT
的测试会被注解@NativeImageTest
,针对原生可执行文件运行。
第 5 章 使用 code.quarkus.redhat.com 创建 Quarkus Maven 项目
作为应用程序开发人员,您可以使用 code.quarkus.redhat.com 生成 Quarkus Maven 项目,并自动添加并配置要在应用程序中使用的扩展。另外,code.quarkus.redhat.com 会自动管理将项目编译成原生可执行文件所需的配置参数。
本节介绍了生成 Quarkus Maven 项目的过程,包括:
- 指定应用程序的基本详情。
- 选择您要包含在项目中的扩展。
- 使用项目文件生成可下载的存档。
- 使用自定义命令编译和启动应用程序。
先决条件
- 具有 Web 浏览器。
流程
- 使用 Web 浏览器进入到 https://code.quarkus.redhat.com。
指定项目的基本详情:
-
输入项目的组名称。名称的格式遵循 Java 软件包命名约定,如
org.acme
。 -
输入您要用于项目生成的 Maven 工件的名称,如
code-with-quarkus
。 选择您要用来编译和启动应用程序的构建工具。您选择的构建工具决定:
- 生成的项目的目录结构。
- 您生成的项目中使用的配置文件格式。
在生成项目后,用来编译和启动应用程序的自定义构建脚本和命令会显示 code.quarkus.redhat.com。
注意红帽提供了对使用 code.quarkus.redhat.com 创建 Quarkus Maven 项目的支持。红帽不支持生成 Gradle 项目。
-
输入项目的组名称。名称的格式遵循 Java 软件包命名约定,如
指定应用程序项目的更多详情:
- 选择 Configure more options 来显示包含额外应用程序详情的字段。
-
输入项目生成的工件中使用的版本。此字段的默认值为
1.0.0-SNAPSHOT
。建议使用 语义版本 控制,但如果您偏好使用不同类型的版本控制。 选择您是否希望 code.quarkus.redhat.com 将示例代码添加到您的项目中。当您从扩展列表中添加标记为
图标的扩展时,您可以启用这个选项,以便在生成项目时为这些扩展自动创建示例类文件和资源文件。当您不添加提供示例代码的任何扩展时,这个选项不会影响您生成的项目。
注意code.quarkus.redhat.com 会自动使用红帽构建的 Quarkus 的最新版本。您可在生成项目后手动更改
pom.xml
文件中的 BOM 版本。
从扩展列表中选择您要在应用程序中使用的扩展。所选扩展包含在 Quarkus 应用程序的依赖项中,及其版本由 Quarkus 平台管理,以确保其兼容性。
您可以启用这个选项来为标记为
图标的扩展自动生成示例代码。
请注意,红帽为列表上的单个扩展 提供不同的支持级别,由每个扩展名称旁的标签表示:
- 红帽完全支持 SUPPORTED 扩展,用于生产环境中的企业级应用程序。
- 在 技术预览功能支持范围 下,红帽对生产环境中的 支持 受到有限的支持。
- 红帽不支持将 DEV-SUPPORT 扩展用于生产环境,但红帽提供的核心功能由红帽开发人员支持用于开发新应用程序。
- 红帽不支持未标记的扩展用于生产环境。
DEPRECATED 扩展计划被提供相同功能的较新的技术或实施替代。
您可以扩展每个扩展旁边的溢出菜单,以访问您可以使用的附加选项:
- 在命令行中使用 Quarkus maven 插件,将扩展添加到现有项目。
-
复制 XML 代码片段,将扩展添加到项目的
pom.xml
文件中。 -
获取每个扩展的
groupId
、artifactId
和version
。 打开扩展指南。
- 选择 Generate your application 来确认您的选择并显示覆盖页面,其中包含包含您生成的项目的存档的下载链接。覆盖屏幕还显示可用于编译和启动应用程序的自定义命令。
- 选择 Download the ZIP,将生成的项目文件的归档保存到机器中。
- 提取存档的内容。
进入包含您提取的项目文件的目录:
cd <directory_name>
以开发模式编译并启动应用程序:
./mvnw compile quarkus:dev
第 6 章 配置 Java 编译器
默认情况下,Quarkus Maven 插件从 maven-compiler-plugin
插件将编译器标志传递给 javac
命令。
流程
要自定义开发模式中使用的编译器标志,请将
配置
部分添加到plugin
块,并设置compilerArgs
属性。您还可以设置源
、目标和
jvmArgs
。例如,要将--enable-preview
传递给 JVM 和javac
添加以下行:<plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus-plugin.version}</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> <compilerArgs> <arg>--enable-preview</arg> </compilerArgs> <jvmArgs>--enable-preview</jvmArgs> </configuration> ... </plugin>
第 7 章 使用 Quarkus 应用程序安装和管理 Java 扩展
您可以使用 Java 扩展来扩展应用程序的功能,并配置、启动并将框架集成到应用程序中。此流程演示了如何查找和添加 Quarkus 项目的扩展。
先决条件
- 您有一个 Quarkus Maven 项目。
流程
- 导航到 Quarkus 项目目录。
要列出可用的扩展,请输入以下命令:
./mvnw quarkus:list-extensions
要为项目添加扩展,请输入以下命令,其中
<extension>
为您要添加的扩展的组、工件、版本(GAV):./mvnw quarkus:add-extension -Dextensions="<extension>"
例如,要添加 Agroal 扩展,请输入以下命令:
./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-agroal"
要搜索特定扩展,请在
-Dextensions=
之后输入扩展名称或部分名称。以下示例搜索在名称中包含文本jdbc
、groal
和non-exist-ent
的扩展:./mvnw quarkus:add-extension -Dextensions=jdbc,agroal,non-exist-ent
这个命令返回以下结果:
❌ Multiple extensions matching 'jdbc' * io.quarkus:quarkus-jdbc-h2 * io.quarkus:quarkus-jdbc-mariadb * io.quarkus:quarkus-jdbc-postgresql Be more specific e.g using the exact name or the full gav. ✅ Adding extension io.quarkus:quarkus-agroal ❌ Cannot find a dependency matching 'non-exist-ent', maybe a typo? [...]
要安装特定文本字符串返回的所有扩展,请在
-Dextensions=
之后输入扩展名称或部分名称。以下示例搜索并安装以hibernate-
开头的所有扩展:./mvnw quarkus:add-extension -Dextensions="hibernate-*"
第 8 章 将 Quarkus 项目导入到 IDE 中
虽然可以在文本编辑器中开发 Quarkus 项目,但您可能会发现使用集成开发环境(IDE)在项目上运行。以下说明演示了如何将 Quarkus 项目导入到特定的 IDE 中。
先决条件
- 您有一个 Quarkus Maven 项目。
流程
完成以下部分中的步骤:
CodeReady Studio 或 Eclipse
- 在 CodeReady Studio 或 Eclipse 中,点 File → Import。
- 选择 Maven → Existing Maven Project。
- 在下一屏幕中,选择项目的 root 位置。此时会出现找到的模块列表。
- 选择生成的项目并点 Finish。
要启动应用程序,请在新终端窗口中输入以下命令:
./mvnw compile quarkus:dev
IntelliJ
在 IntelliJ 中,完成以下任务之一:
- 选择 File → New → Project From Existing Sources。
- 在 Welcome 页面上,选择 Import project。
- 选择项目根目录。
- 从外部模型选择 Import project,然后选择 Maven。
- 检查选项,然后单击 Next。
- 点 Finish。
要启动应用程序,请在新终端窗口中输入以下命令:
./mvnw compile quarkus:dev
Apache NetBeans
- 选择 File → Open Project。
-
选择
项目根目录
。 - 单击 Open Project。
要启动应用程序,请在新终端窗口中输入以下命令:
./mvnw compile quarkus:dev
Visual Studio Code
- 安装 Java 扩展包。
- 在 Visual Studio Code 中,打开您的项目目录。项目作为 Maven 项目加载。
第 9 章 配置 Quarkus 项目输出
在构建应用程序前,您可以通过更改 application.properties
文件中的应用程序属性的默认值来控制构建命令的输出。
先决条件
- 您有一个 Quarkus Maven 项目。
流程
-
在文本编辑器中打开
application.properties
文件。 编辑您要更改并保存文件的属性值。
下表列出了您可以更改的属性:
属性 描述 类型 Default(默认) quarkus.package.main-class
应用程序的入口点。在大多数情况下,您应该更改此值。
字符串
io.quarkus.runner.GeneratedMain
quarkus.package.type
请求的输出类型。
字符串
JAR
quarkus.package.uber-jar
Java 运行程序是否应打包为 uber-JAR。
布尔值
false
quarkus.package.manifest.add-implementation-entries
实施信息是否应包含在运行程序 JAR 文件的
MANIFEST.MF
文件中。布尔值
true
quarkus.package.user-configured-ignored-entries
不应复制到输出工件的文件。
string (list)
quarkus.package.runner-suffix
应用到运行程序 JAR 文件的后缀。
字符串
-runner
quarkus.package.output-directory
应用程序构建的输出文件夹。这相对于构建系统目标目录解析。
字符串
quarkus.package.output-name
最终工件的名称。
字符串
第 10 章 测试 Quarkus 应用程序
默认情况下,当您测试 Quarkus 应用程序时,Maven 将使用 测试配置
配置集。但是,您可以使用 Maven Surefire 插件为测试创建自定义配置配置集。
先决条件
- 您有一个使用 Apache Maven 创建的 Quarkus 项目。
流程
编辑以下示例以满足您的测试要求,其中 <
;profile_name
> 是测试配置集的名称:<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemPropertyVariables> <quarkus.test.profile><profile_name></quarkus.test.profile> <buildDirectory>${project.build.directory}</buildDirectory> [...] </systemPropertyVariables> </configuration> </plugin> </plugins> </build> [...] </project>
您不能在原生模式中使用自定义测试配置配置集。原生测试始终使用 prod
配置集运行。
第 11 章 记录 Quarkus 应用程序构建类路径树
Quarkus 构建过程将您在应用程序中使用的扩展的部署依赖项添加到原始应用程序类路径。您可以查看构建类路径中包含的依赖项和版本。quarkus-bootstrap
Maven 插件包含 build-tree
目标,用于显示应用程序的构建依赖项树。
先决条件
- 您有一个 Quarkus Maven 应用程序。
流程
将插件配置添加到
pom.xml
文件中:<project> [...] <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-bootstrap-maven-plugin</artifactId> <version>${quarkus-plugin.version}</version> </plugin> [...] </project>
要列出应用程序的构建依赖项树,请输入以下命令:
./mvnw quarkus-bootstrap:build-tree
这个命令的输出应类似以下示例:
[INFO] --- quarkus-bootstrap-maven-plugin:1.11:build-tree (default-cli) @ getting-started --- [INFO] org.acme:getting-started:jar:1.0-SNAPSHOT [INFO] └─ io.quarkus:quarkus-resteasy-deployment:jar:1.11 (compile) [INFO] ├─ io.quarkus:quarkus-resteasy-server-common-deployment:jar:1.11 (compile) [INFO] │ ├─ io.quarkus:quarkus-core-deployment:jar:1.11 (compile) [INFO] │ │ ├─ commons-beanutils:commons-beanutils:jar:1.9.3 (compile) [INFO] │ │ │ ├─ commons-logging:commons-logging:jar:1.2 (compile) [INFO] │ │ │ └─ commons-collections:commons-collections:jar:3.2.2 (compile) ...
mvn dependencies:tree
命令只显示应用程序的运行时依赖项
第 12 章 生成原生可执行文件
您可以使用 Podman 或 Docker 等容器运行时从 Quarkus 应用程序生成原生可执行文件。Quarkus 使用构建器镜像生成二进制可执行文件,您可以和 Red Hat Universal Base Images RHEL8-UBI 和 RHEL8-UBI 最小一起使用。Red Hat build of Quarkus 1.11 使用 registry.access.redhat.com/quarkus/mandrel-20-rhel8:20.3
作为 quarkus.native.builder-image
属性的默认值。
应用程序的原生可执行文件包含应用程序代码、所需的库、Java API 和虚拟机(VM)的减少版本。较小的虚拟机基础改进了应用程序的启动时间,并生成最小的磁盘占用。
流程
打开 Getting Started 项目
pom.xml
文件,并验证该文件是否包含native
配置集:<profiles> <profile> <id>native</id> <properties> <quarkus.package.type>native</quarkus.package.type> </properties> </profile> </profiles>
注意使用 Quarkus
native
配置集允许您运行原生可执行文件和原生镜像测试。使用以下方法之一构建原生可执行文件:
使用 Docker 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true
使用 Podman 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
这些命令在
目标
目录中创建get-started the guestfish-runner
二进制文件。重要在分析和优化过程中,将 Quarkus 应用程序编译到原生可执行文件中会消耗大量内存。您可以通过设置
quarkus.native.native-image-xmx
配置属性来限制原生编译过程中使用的内存量。设置低内存限值可能会增加构建时间。如需了解更多详细信息,请参阅 原生可执行配置属性。
运行原生可执行文件:
./target/getting-started-*-runner
构建原生可执行文件时,启用了
prod
配置集,并使用prod
配置集运行 Quarkus 原生测试。您可以使用quarkus.test.native-image-profile
属性进行修改。
12.1. 手动创建容器
本节介绍如何使用应用程序为 Linux X86_64 手动创建容器镜像。当您使用 Quarkus 原生容器生成原生镜像时,它会创建一个以 Linux X86_64 操作系统为目标的可执行文件。如果您的主机操作系统与此不同,您将无法直接运行二进制文件,您需要手动创建容器。
您的 Quarkus 入门项目在 src/main/docker
目录中包含一个 Dockerfile.native
,其内容如下:
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work COPY --chown=1001:root target/*-runner /work/application EXPOSE 8080 USER 1001 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Dockerfile
使用 UBI 作为基础镜像。此基础镜像设计为在容器中工作。Dockerfile
使用 基础镜像的最小版本 来缩小生成的镜像的大小。
流程
使用以下方法之一构建原生 Linux 可执行文件:
使用 Docker 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true
使用 Podman 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
使用以下方法之一构建容器镜像:
使用 Docker 构建容器镜像:
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
使用 Podman 构建容器镜像
podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
运行容器:
使用 Docker 运行容器:
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
使用 Podman 运行容器:
podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
第 13 章 测试原生可执行文件
测试以原生模式运行的应用程序,以测试原生可执行文件的功能。使用 @NativeImageTest
注释来构建原生可执行文件,并根据 http 端点运行测试。
流程
打开
pom.xml
文件,并验证native
配置集是否包含以下元素:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>${surefire-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <systemPropertyVariables> <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </execution> </executions> </plugin>
failsafe-maven-plugin
运行集成测试,并指示生成的原生可执行文件的位置。打开
src/test/java/org/acme/quickstart/NativeGreetingResourceIT.java
文件,并验证该文件是否包含以下内容:package org.acme.quickstart; import io.quarkus.test.junit.NativeImageTest; @NativeImageTest 1 public class NativeGreetingResourceIT extends GreetingResourceTest { 2 // Run the same tests }
运行测试:
./mvnw verify -Pnative
以下示例显示了这个命令的输出:
./mvnw verify -Pnative ... [getting-started-1.0-SNAPSHOT-runner:18820] universe: 587.26 ms [getting-started-1.0-SNAPSHOT-runner:18820] (parse): 2,247.59 ms [getting-started-1.0-SNAPSHOT-runner:18820] (inline): 1,985.70 ms [getting-started-1.0-SNAPSHOT-runner:18820] (compile): 14,922.77 ms [getting-started-1.0-SNAPSHOT-runner:18820] compile: 20,361.28 ms [getting-started-1.0-SNAPSHOT-runner:18820] image: 2,228.30 ms [getting-started-1.0-SNAPSHOT-runner:18820] write: 364.35 ms [getting-started-1.0-SNAPSHOT-runner:18820] [total]: 52,777.76 ms [INFO] [INFO] --- maven-failsafe-plugin:2.22.1:integration-test (default) @ getting-started --- [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running org.acme.quickstart.NativeGreetingResourceIT Executing [/data/home/gsmet/git/quarkus-quickstarts/getting-started/target/getting-started-1.0-SNAPSHOT-runner, -Dquarkus.http.port=8081, -Dtest.url=http://localhost:8081, -Dquarkus.log.file.path=build/quarkus.log] 2019-04-15 11:33:20,348 INFO [io.quarkus] (main) Quarkus 999-SNAPSHOT started in 0.002s. Listening on: http://[::]:8081 2019-04-15 11:33:20,348 INFO [io.quarkus] (main) Installed features: [cdi, resteasy] [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.387 s - in org.acme.quickstart.NativeGreetingResourceIT ...
注意Quarkus 在自动失败原生测试前等待 60 秒启动。您可以使用
quarkus.test.native-image-wait-time
系统属性更改此持续时间。您可以使用以下命令来扩展等待时间,其中 <
duration>
; 是等待的时间(以秒为单位):./mvnw verify -Pnative -Dquarkus.test.native-image-wait-time=
<duration>
第 14 章 使用 Quarkus 开发模式
开发模式启用后台编译的热部署,这意味着当您修改 Java 文件或资源文件时,刷新浏览器,更改会自动生效。这也适用于配置属性文件等资源文件。
先决条件
- 您有一个 Quarkus Maven 应用程序。
流程
要在开发模式下启动 Quarkus,请在包含 Quarkus 应用程序
pom.xml
文件的目录中输入以下命令:./mvnw quarkus:dev
- 更改应用程序并保存文件。
刷新浏览器以触发工作区的扫描。
如果检测到任何更改,则会重新编译 Java 文件并重新部署应用程序。然后,您的请求由重新部署的应用提供服务。如果编译或部署存在问题,则会出现错误页面。
在开发模式中,调试器被激活并侦听端口
5005
。可选:要在运行应用程序前等待调试器附加,请包括
-Dsuspend
:./mvnw quarkus:dev -Dsuspend
可选: 要防止调试器运行,请包含
-Ddebug=false
:./mvnw quarkus:dev -Ddebug=false
第 15 章 调试 Quarkus 项目
当 Quarkus 以开发模式启动时,默认启用调试。调试器侦听端口 5005
,而不暂停 JVM。
先决条件
- 您有一个 Quarkus Maven 项目。
流程
使用以下方法之一控制调试:
通过系统属性控制调试器
更改
debug
系统属性的以下值之一,其中PORT
是调试器侦听的端口:-
false
:JVM 从禁用调试模式开始。 -
true
:JVM 以 debug 模式启动,并侦听端口5005
。 -
客户端
:JVM 以客户端模式启动,并尝试连接到localhost:5005
。 -
PORT
:JVM 以 debug 模式启动,并侦听PORT
。
-
更改
suspend
系统属性的值。Quarkus 以 debug 模式启动时使用此属性。-
Y
或true
:调试模式 JVM 启动挂起。 -
N
或false
:调试模式 JVM 启动而不挂起。
-
从命令行控制调试器
要使用 JVM 以调试模式启动 Quarkus 应用程序,请输入以下命令:
./mvnw compile quarkus:dev -Ddebug
为特定主机域启用调试器
在开发模式中,仅针对您在 localhost
上执行的应用程序启用调试器。您必须在其他主机上手动启用调试。
使用
debugHost
选项在特定主机上启用调试。您必须将 <host-ip-address
> 替换为要启用调试的主机的 IP 地址。./mvnw compile quarkus:dev -DdebugHost=<host-ip-address>
要在所有主机上启用调试,将 <
host-ip-address>
替换为0.0.0。
./mvnw compile quarkus:dev -DdebugHost=0.0.0.0
第 16 章 其他资源
更新于 2023-05-16