Conditional Extension Dependencies
Quarkus エクステンションの依存関係は通常、プロジェクトのビルドファイル内の他のプロジェクト依存関係 (Maven の pom.xml や Gradle ビルドスクリプトなど) と同じ方法で設定されます。Quarkus は、Maven や Gradle では標準でサポートされていない種類の依存関係にも対応しています。条件付き Quarkus エクステンションの依存関係がその一例です。
条件付き依存関係
条件付き依存関係は、特定の条件が満たされた場合にのみアクティブになる依存関係です。条件が満たされない場合、依存関係はアクティブになりません。この点で、条件付き依存関係はオプションとして分類できます。つまり、結果の依存関係グラフに表示されるかどうかはわかりません。
条件付き依存関係の典型的な例としては、必要な依存関係がすべてクラスパスに存在する場合にのみ、クラスパスに追加する必要があるコンポーネントが挙げられます。コンポーネントの必要な依存関係の 1 つ以上が利用できない場合は、失敗するのではなく、コンポーネントを追加しないようにする必要があります。
条件付き Quarkus エクステンションの依存関係
Quarkus エクステンションは、他の Quarkus エクステンションまたは通常の Maven アーティファクトに対する 1 つ以上の条件付き依存関係を宣言できます。
たとえば、次のシナリオを考えてみましょう。 quarkus-extension-a には quarkus-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>)。 |
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.
|
dependencyCondition 要素には artifact が複数含まれる場合があります。その場合、条件を満たすには、設定されたすべてのアーティファクトがクラスパス上に存在している必要があります。
これで、 quarkus-extension-b の記述子に依存条件が記録されたので、他のエクステンションはそれに対する条件付き依存を宣言できるようになります。
extensions with dependency conditions present in their metadata could still appear as regular dependencies in Maven pom.xml and Gradle build scripts, in which case their conditions will simply be ignored.
|
条件付き依存関係は、Quarkus エクステンションのランタイムアーティファクトで設定されます。この例では、 quarkus-extension-a は quarkus-extension-b に対する条件付き依存関係を宣言します。これは、次の 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 |
quarkus-extension-b に依存条件が含まれている場合、Quarkus は quarkus-extension-b に対するオプションの依存関係を条件付きとして解釈します。
| In general, for every runtime extension artifact dependency on another runtime extension artifact there must be the 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 依存を宣言します。 |
If the quarkus-extension-b dependency wasn’t declared as <optional>true</optional> it would make the quarkus-extension-b a required dependency of the quarkus-extension-a and its dependency condition would be ignored by the application dependency resolver.
|
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 の依存関係は全く必要ありません。
開発モードのみのエクステンションの依存関係
エクステンションは、開発モードを条件として使用したり、依存関係をアクティブ化するための条件の 1 つとして使用したりして、他のエクステンションに対する条件付き依存関係を宣言することもできます。
開発モード専用のエクステンションの依存関係は、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 の依存関係として開発モードでのみ追加され、他のモード (prod または test) では追加されません。
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 の依存関係として追加されます。