编辑此页面

条件扩展依赖项

Quarkus 扩展依赖通常以与项目中任何其他项目依赖相同的方式配置在项目的构建文件中,例如 Maven pom.xml 或 Gradle 构建脚本。但是,Quarkus 还支持 Maven 和 Gradle 默认不支持的依赖类型。条件 Quarkus 扩展依赖就是一个例子。

条件依赖

条件依赖是指只有在满足特定条件时才激活的依赖。如果条件不满足,则依赖项**不会**激活。在这方面,条件依赖可以被归类为可选的,这意味着它们可能出现在最终依赖关系图中,也可能不会。

条件依赖的典型示例是应该**仅**在classpath中存在其所有必需依赖项的情况下才添加到classpath的组件。如果一个或多个组件的必需依赖项不可用,则组件应该不会添加,而不是失败。

条件 Quarkus 扩展依赖

Quarkus 扩展可能会声明一个或多个对其他 Quarkus 扩展或常规 Maven 项目的条件依赖。

让我们考虑以下场景作为示例:quarkus-extension-aquarkus-extension-b 有一个可选依赖,只有在 quarkus-extension-c 在应用程序依赖(直接或传递)中找到时,才应将其包含在 Quarkus 应用程序中。在这种情况下,quarkus-extension-c 的存在是条件,如果满足条件,将在解析 Quarkus 应用程序依赖时触发包含 quarkus-extension-b

触发扩展激活的条件在扩展的 META-INF/quarkus-extension.properties 中配置,该文件包含在扩展的运行时项目中。扩展开发人员可以添加以下配置来表达必须满足才能激活扩展的条件

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- SKIPPED CONTENT -->

  <artifactId>quarkus-extension-b</artifactId> (1)

  <!-- SKIPPED CONTENT -->

  <build>
    <plugins>
      <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-extension-maven-plugin</artifactId>
        <version>${quarkus.version}</version>
        <executions>
          <execution>
            <phase>process-resources</phase>
            <goals>
              <goal>extension-descriptor</goal> (2)
            </goals>
            <configuration>
              <dependencyCondition> (3)
                <artifact>org.acme:quarkus-extension-c</artifact> (4)
              </dependencyCondition>
            </configuration>
          </execution>
        </executions>
      </plugin>

  <!-- SKIPPED CONTENT -->
1 运行时 Quarkus 扩展项目 ID;
2 生成扩展描述符的目标,每个 Quarkus 运行时扩展项目都应配置该描述符;
3 依赖项条件的配置,只有满足该条件,才能将此扩展添加到 Quarkus 应用程序,该条件表示为必须存在于应用程序依赖项中的项目列表;
4 项目的项目键(格式为 groupId:artifactId[:<classifier>:<extension>],但通常只是 <groupId>:<artifactId>),必须存在于应用程序依赖项中才能满足条件。
在上面的示例中,条件配置中使用的 artifact 恰好是一个运行时 Quarkus 扩展项目,但它也可能是任何其他项目。

dependencyCondition 元素可以包含多个 artifact,在这种情况下,classpath中必须存在所有已配置的项目才能满足条件。

现在,在 quarkus-extension-b 的描述符中记录了依赖项条件后,其他扩展可以声明对其的条件依赖。

在其元数据中存在依赖项条件的扩展仍然可以作为 Maven pom.xml 和 Gradle 构建脚本中的常规依赖项出现,在这种情况下,它们的条件将被简单地忽略。

条件依赖在 Quarkus 扩展的运行时项目中配置。在此示例中,quarkus-extension-a 将声明对 quarkus-extension-b 的条件依赖,这可以通过以下两种方式完成。

将依赖声明为 optional

如果扩展在其描述符中包含依赖项条件,则其他扩展可以通过简单地将 <optional>true</optional> 添加到依赖项配置来配置对其的条件依赖。在我们的示例中,它看起来像这样

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- SKIPPED CONTENT -->

  <artifactId>quarkus-extension-a</artifactId> (1)

  <!-- SKIPPED CONTENT -->

  <dependencies>
    <dependency>
      <groupId>org.acme</groupId>
      <artifactId>quarkus-extension-b</artifactId> (2)
      <optional>true</optional>
    </dependency>

  <!-- SKIPPED CONTENT -->
1 运行时扩展项目 quarkus-extension-a
2 声明对运行时扩展项目 quarkus-extension-b 的可选 Maven 依赖

鉴于 quarkus-extension-b 包含依赖项条件,Quarkus 会将对 quarkus-extension-b 的可选依赖项解释为条件依赖项。

通常,对于另一个运行时扩展项目上的每个运行时扩展项目依赖,都必须存在另一个部署扩展项目上的相应部署扩展项目依赖。如果运行时依赖项声明为可选,则相应的部署依赖项**必须**也配置为可选。
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- SKIPPED CONTENT -->

  <artifactId>quarkus-extension-a-deployment</artifactId> (1)

  <!-- SKIPPED CONTENT -->

  <dependencies>
    <dependency>
      <groupId>org.acme</groupId>
      <artifactId>quarkus-extension-b-deployment</artifactId> (2)
      <optional>true</optional>
    </dependency>

  <!-- SKIPPED CONTENT -->
1 部署扩展项目 quarkus-extension-a-deployment
2 声明对部署扩展项目 quarkus-extension-b-deployment 的可选 Maven 依赖
如果 quarkus-extension-b 依赖未声明为 <optional>true</optional>,则会使 quarkus-extension-b 成为 quarkus-extension-a 的必需依赖,并且其依赖条件将被应用程序依赖项解析器忽略。

在 Quarkus 扩展描述符中声明条件依赖

条件依赖也可以直接在 Quarkus 扩展描述符中配置。以下是如何在 quarkus-extension-a 的 Quarkus 扩展插件配置中执行此操作的示例

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- SKIPPED CONTENT -->

  <artifactId>quarkus-extension-a</artifactId> (1)

  <!-- SKIPPED CONTENT -->

  <build>
    <plugins>
      <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-extension-maven-plugin</artifactId>
        <version>${quarkus.version}</version>
        <executions>
          <execution>
            <phase>process-resources</phase>
            <goals>
              <goal>extension-descriptor</goal> (2)
            </goals>
            <configuration>
              <conditionalDependencies> (3)
                <artifact>org.acme:quarkus-extension-b:${b.version}</artifact> (4)
              </conditionalDependencies>
            </configuration>
          </execution>
        </executions>
      </plugin>

  <!-- SKIPPED CONTENT -->
1 运行时 Quarkus 扩展项目 ID;
2 生成扩展描述符的目标,每个 Quarkus 运行时扩展项目都应配置该描述符;
3 条件依赖项配置元素;
4 对其他扩展的条件依赖项的项目坐标。

在这种情况下,pom.xml 文件中根本不需要 Maven 依赖项。

仅开发模式扩展依赖

扩展还可以声明对其他扩展的条件依赖,使用开发模式作为条件或作为激活这些依赖的条件之一。

仅开发模式扩展依赖可以在 Quarkus 扩展插件中通过以下方式配置

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- SKIPPED CONTENT -->

  <artifactId>quarkus-extension-a</artifactId> (1)

  <!-- SKIPPED CONTENT -->

  <build>
    <plugins>
      <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-extension-maven-plugin</artifactId>
        <version>${quarkus.version}</version>
        <executions>
          <execution>
            <phase>process-resources</phase>
            <goals>
              <goal>extension-descriptor</goal> (2)
            </goals>
            <configuration>
              <conditionalDevDependencies> (3)
                <artifact>org.acme:quarkus-extension-b:${b.version}</artifact> (4)
              </conditionalDevDependencies>
            </configuration>
          </execution>
        </executions>
      </plugin>

  <!-- SKIPPED CONTENT -->
1 运行时 Quarkus 扩展项目 ID;
2 生成扩展描述符的目标,每个 Quarkus 运行时扩展项目都应配置该描述符;
3 仅应在开发模式下评估的条件依赖;
4 条件依赖的项目坐标。

在此示例中,quarkus-extension-b 可以定义自己的条件来评估,也可以不定义。

如果 quarkus-extension-b 没有定义自己的依赖项条件(其 META-INF/quarkus-extension.properties 中没有记录依赖项条件),则 quarkus-extension-b 将仅作为 quarkus-extension-a 在开发模式下的依赖项添加,而不会在其他模式(生产或测试)下添加。

如果 quarkus-extension-b 确实定义了自己的依赖项条件(其 META-INF/quarkus-extension.properties 中记录了依赖项条件),则仅当满足其条件时(应用程序依赖关系图中存在其所需的项目),quarkus-extension-b 才会作为 quarkus-extension-a 在开发模式下的依赖项添加。

对常规 Maven 项目的开发模式依赖

扩展还可以声明对常规 Maven 项目的条件依赖,这些项目不是 Quarkus 扩展。鉴于常规 Maven 项目不包含 Quarkus 元数据,因此其包含条件由依赖于它们的扩展配置。

例如

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!-- SKIPPED CONTENT -->

  <artifactId>quarkus-extension-a</artifactId> (1)

  <!-- SKIPPED CONTENT -->

  <build>
    <plugins>
      <plugin>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-extension-maven-plugin</artifactId>
        <version>${quarkus.version}</version>
        <executions>
          <execution>
            <phase>process-resources</phase>
            <goals>
              <goal>extension-descriptor</goal> (2)
            </goals>
            <configuration>
              <conditionalDevDependencies> (3)
                <artifact>org.acme:library-b:${b.version}</artifact> (4)
              </conditionalDevDependencies>
            </configuration>
          </execution>
        </executions>
      </plugin>

  <!-- SKIPPED CONTENT -->
1 运行时 Quarkus 扩展项目 ID;
2 生成扩展描述符的目标,每个 Quarkus 运行时扩展项目都应配置该描述符;
3 仅应在开发模式下评估的条件依赖;
4 条件依赖的项目坐标。

在此示例中,library-b 是一个常规 Maven 项目,仅当应用程序在开发模式下启动时才会作为 quarkus-extension-a 的依赖项添加。

相关内容