Conditional Extension Dependencies
Quarkusエクステンションの依存関係は、通常、プロジェクトのビルドファイルにおいて、他のプロジェクトの依存関係と同じ方法で設定されます(例:Maven pom.xml またはGradleビルドスクリプト)。しかし、MavenやGradleではまだデフォルトではサポートされていない依存関係の種類があります。ここでいう「条件付き依存関係」はその一例です。
条件付き依存関係
条件付き依存関係の概念の背後にある考え方は、そのような依存関係は、ある条件が満たされた場合にのみ有効化しなければならないということです。条件が満たされていない場合は、その依存関係を有効にして はいけません 。この点から、条件付き依存関係はオプションとして分類することができます。つまり、結果として得られるプロジェクト依存関係のセットに現れるかもしれないし、現れないかもしれません。
条件付き依存関係はどのような場合に役立つのでしょうか。典型的な例は、必要な依存関係がすべて利用可能な場合に のみ 起動されるべきコンポーネントです。そのコンポーネントの必要な依存関係が1つ以上利用できない場合、失敗するのではなく、単にそのコンポーネントをアクティブにしないようにします。
Quarkus条件付きエクステンション依存関係
Quarkusは条件付きエクステンション依存関係をサポートしています。つまり、1つのQuarkusエクステンションが、他のQuarkusエクステンションに対して1つ以上の条件付き依存関係を宣言することができます。エクステンション以外のアーティファクトに対する、もしくは、からの条件付き依存関係はサポートされていません。
次のシナリオを考えてみましょう: quarkus-extension-a に、その(直接または推移的)依存関係の中に quarkus-extension-c が見つかった場合にのみ有効にする必要がある quarkus-extension-b へのオプションの依存関係があるとします。言い換えれば、 quarkus-extension-c の存在が満たされた場合に、Quarkusアプリケーションのビルド中に quarkus-extension-b を有効にする条件です。
エクステンションの有効化のトリガーとなる条件は、エクステンションの記述子で設定され、この記述子はエクステンションのランタイムアーティファクトに META-INF/quarkus-extension.properties として含まれています。エクステンションの記述子は、エクステンションのビルド時に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-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。この例では quarkus-extension-b 。 |
| 2 | すべてのQuarkusランタイムエクステンションプロジェクトを構成する必要があるエクステンション記述子を生成するゴール |
| 3 | このエクステンションがQuarkusアプリケーションに含まれるために満たさなければならない条件の設定で、アプリケーションの依存関係の中に存在しなければならないアーティファクトのリストとして表現 |
| 4 | 条件を満たすためにアプリケーションの依存関係の中に存在しなければならないアーティファクトのアーティファクトキー(groupId:artifactId[:<classifier>:<extension>] の形式で、通常は単に <groupId>:<artifactId>)。 |
In the example above the artifact used in the condition configuration happens to be a runtime Quarkus extension artifact but it could as well be any other artifact. There could also be more than one artifact element in the body of dependencyCondition.
|
さて、 quarkus-extension-b の記述子に依存関係有効化条件があると、他のエクステンションが条件付きの依存関係を宣言することができます。
条件付きの依存関係は、Quarkusエクステンションのランタイムアーティファクトで設定されます。この例では、 quarkus-extension-b に対する条件付き依存関係を持つ quarkus-extension-a であり、2つの方法で表現することができます。
Declaring a dependency as 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 | ランタイムエクステンションアーティファクトに対するオプションのMaven依存関係を宣言 quarkus-extension-b |
| In general, for every runtime extension artifact dependency on another runtime extension artifact there must be a corresponding deployment extension artifact dependency on the other deployment extension artifact. And if the runtime dependency is declared as optional then the corresponding deployment dependency must also be configured as 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-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 依存を宣言します。 |
通常、オプションのMavenエクステンション依存関係は、ビルド時にQuarkusの依存関係リゾルバによって無視されます。しかし、この場合は、オプションの依存関係 quarkus-extension-b はそのエクステンション記述子に依存関係の条件が含まれており、このオプションのMaven依存関係がQuarkusの条件付きエクステンション依存関係になります。
If quarkus-extension-b wasn’t declared as <optional>true</optional> that would make quarkus-extension-b a required dependency of quarkus-extension-a and its dependency condition would be ignored.
|
Quarkusエクステンション記述子での条件付き依存関係の宣言
条件付きの依存関係は、Quarkusのエクステンション記述子でも設定できます。上記で設定した条件付き依存関係は、 quarkus-extension-a のエクステンション記述子で次のように表現できます。
<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)
<extension>org.acme:quarkus-extension-b:${b.version}</extension> (4)
</conditionalDependencies>
</configuration>
</execution>
</executions>
</plugin>
<!-- SKIPPED CONTENT -->
| 1 | ランタイムQuarkusエクステンションアーティファクトID、この例では quarkus-extension-a |
| 2 | すべてのQuarkusランタイムエクステンションプロジェクトが設定されるべきエクステンション記述子を生成するゴール |
| 3 | 条件付き依存関係の設定要素 |
| 4 | 他のエクステンションへの条件付き依存関係のアーティファクト座標 |
この場合、 pom.xml では、Maven の依存関係は全く必要ありません。