条件付きエクステンション依存関係
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> )。 |
上記の例では、条件設定で使用されている artifact は、たまたまランタイムのQuarkusエクステンションアーティファクトでしたが、他のアーティファクトである可能性もあります。また、 dependencyCondition のボディ内に複数の artifact 要素が存在する可能性もあります。
|
さて、 quarkus-extension-b
の記述子に依存関係有効化条件があると、他のエクステンションが条件付きの依存関係を宣言することができます。
条件付きの依存関係は、Quarkusエクステンションのランタイムアーティファクトで設定されます。この例では、 quarkus-extension-b
に対する条件付き依存関係を持つ quarkus-extension-a
であり、2つの方法で表現することができます。
依存関係を 'オプション' として宣言
あるエクステンションの記述子に依存条件が設定されていた場合、他のエクステンションは依存関係の設定に <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 |
一般に、ランタイムエクステンションアーティファクトが他のランタイムエクステンションアーティファクトに依存している場合、それに対応するデプロイメントエクステンションアーティファクトの依存関係がなければなりません。また、ランタイムの依存関係がオプションとして宣言されている場合は、対応するデプロイメントの依存関係もオプションとして設定する 必要があります 。 |
<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の条件付きエクステンション依存関係になります。
もし quarkus-extension-b が <optional>true</optional> として宣言されていなければ、 quarkus-extension-b は quarkus-extension-a の必須の依存関係となり、その依存関係の条件は無視されます。
|
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 の依存関係は全く必要ありません。