2021年7月30日#发布
平台和流:发现Quarkus扩展的新方法
作者:Alexey Loubyansky
合著者:Erin Schnabel
平台和流:发现Quarkus扩展的新方式
正如你可能已经从最近的Quarkus Insights节目中看到的(特别是#48、#55和#57),我们在2.x流中对我们的工具进行了一些改变,以改善开发者的体验。当2.0发布时,一些眼尖的Quarkus客户端用户发现了一些新的选项,我们很高兴能在Quarkus 2.1的发布中解释这些选项是怎么回事。
**TL;DR:**我们有一套全新的更细化的BOM,你可以用它来代替大quarkus-universe-bom
。我们部署了一个注册表服务,在这些更细化的BOM中统一管理平台兼容性,我们的工具(maven、gradle和CLI)知道如何与这个注册表合作,以简化发现适用于你的项目的扩展。
从2.1.0.Final版本开始,Quarkus CLI使用这个注册表来解决项目使用的Quarkus平台。
# The client will create a project with the latest/recommended quarkus release
$ quarkus create
# You can use the --stream parameter to narrow to a specific release
$ quarkus create -S 2.0
$ quarkus create -S 2.1
平台模型的演变
Quarkus 1.x平台是基于一个单一的BOM -io.quarkus:quarkus-universe-bom
,它将被Quarkus应用程序导入。宇宙BOM将包括所有Quarkus平台的扩展以及它们的依赖关系。BOMs的目的是使其容易调整共同的依赖关系,使其适用于应用程序中使用的所有库和框架的版本。然而,糟糕的BOM构成可能实际上使其很难或实际上无法实现。一般来说,BOM管理的依赖范围越广,当用户在他们的应用程序中加入不受BOM管理的库时,遇到不兼容问题的风险就越大。
io.quarkus:quarkus-universe-bom
,正如它的artifactId所暗示的那样,肯定是一个庞大而多样的BOM,包括对Camel、Google Cloud Services、Kogito、OptaPlanner和其他Quarkus平台成员的依赖。导入io.quarkus:quarkus-universe-bom
,将对一个应用程序强制执行~3600个依赖版本约束。
除了它实际上总是远远超过需要的事实之外,它实际上可能导致严重的兼容性问题,如果Quarkus平台的BOM不试图管理 "宇宙 "的话,这些问题本来是可以避免的。例如,在一个实际上不包含任何Camel Quarkus扩展的应用程序中包含一个依赖于不同版本的commons-beanutils:commons-beanutils
的库可能会成为问题,因为io.quarkus:quarkus-universe-bom
会强制执行Camel Quarkus所要求的版本。
从Quarkus 2.0.0.Final开始,除了单一的io.quarkus:quarkus-universe-bom
,我们还定义了一些针对平台成员的BOM,比如说
-
io.quarkus.platform:quarkus-bom:2.1.0.Final
- 相当于io.quarkus:quarkus-bom
。 -
io.quarkus.platform:quarkus-camel-bom:2.1.0.Final
- 只管理Camel Quarkus相关的扩展和它们所需的依赖关系。 -
io.quarkus.platform:quarkus-kogito-bom:2.1.0.Final
- 只管理Kogito Quarkus相关的扩展和它们所需的依赖关系。 -
等等
现在,应用程序只需要导入相关的BOM,这就避免了从 "宇宙 "的其他部分强制执行依赖性约束。
鉴于每个成员的BOM实际上是io.quarkus:quarkus-universe-bom 的一个片段,成员BOM可以以任何顺序导入,而不会产生冲突。 |
开发工具支持
开发工具,如Quarkus CLI、Maven或Gradle插件,可以用来创建和管理使用新平台模型的Quarkus应用项目。
在Quarkus 2.0.0.Final中,io.quarkus:quarkus-universe-bom 仍然是默认的BOM。从Quarkus 2.1.0.Final开始,我们建议使用更细化的、针对成员的BOM来代替。 |
探索这个新的平台解析能力的最简单的方法是使用新的Quarkus CLI,它可以通过以下方式安装,例如:1.
curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio
一旦安装完毕,你可以通过执行以下命令创建一个项目
quarkus create app
对于CLI的早期版本(2.1.0.Final之前),你需要指定--registry-client 选项,否则创建的项目将使用与客户端版本相关的io.quarkus:quarkus-universe-bom 。 |
生成的pom.xml
,将导入以下BOM。
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>2.1.0.Final</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
</properties>
<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>
这是一个等同于io.quarkus:quarkus-bom
,不包括任何其他平台成员,如Camel、Kogito、OptaPlanner等。
让我们创建另一个项目,其中确实包括Kogito扩展。
quarkus create -x kogito-quarkus-rules kogito-app
新项目导入了两个BOM(即与该项目相关的io.quarkus:quarkus-universe-bom
的两个片段)。
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>2.1.0.Final</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-kogito-bom</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<dependencies>
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-quarkus-rules</artifactId>
</dependency>
开发工具中更广泛的Quarkus生态系统支持
Quarkus平台并不代表整个Quarkus扩展生态系统,又称Quarkiverse,而是一组针对Quarkus作为开发堆栈的主要使用场景的扩展。这意味着仍有大量的Quarkus扩展没有出现在Quarkus平台(BOM)中,例如,大部分托管在Quarkiverse Hub上的扩展。这些非平台的扩展仍然可以像通常的应用程序依赖性一样被添加到Quarkus应用程序中。Quarkus 2.1.0.Final开发工具使之非常容易,例如
quarkus create -x prettytime test-time-app
将创建一个带有非平台Quarkus Pretty Time扩展的新Quarkus项目。
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>2.1.0.Final</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
</properties>
<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>
<dependencies>
<dependency>
<groupId>io.quarkiverse.prettytime</groupId>
<artifactId>quarkus-prettytime</artifactId>
<version>0.1.0</version>
</dependency>
Maven和Gradle插件中的注册表客户端支持
Quarkus的Maven和Gradle插件仍然可以用来管理Quarkus项目。
mvn io.quarkus:quarkus-maven-plugin:2.1.0.Final:create \
-Dextensions=kogito-quarkus-rules,prettytime \
-DprojectGroupId=org.acme -DprojectArtifactId=quarkus-app -DprojectVersion=1.0 \
Quarkus是开放的。本项目的所有依赖项都在Apache软件许可2.0或兼容许可下提供。
这个网站是用Jekyll建立的,托管在Github Pages上,是完全开源的。如果你想让它变得更好,请分叉该网站并向我们展示你的成果。
导航
贡献
获取帮助
Quarkus是由社区项目组成的