All-open コンパイラプラグイン
Kotlinでは、クラスとそのメンバーはデフォルトでfinalです。このため、Spring AOPのようにクラスがopenであることを要求するフレームワークやライブラリを使用するのが不便になります。all-openコンパイラプラグインは、Kotlinをこれらのフレームワークの要件に適合させ、特定のAノテーションが付与されたクラスとそのメンバーを、明示的なopenキーワードなしでopenにします。
例えば、Springを使用する場合、全てのクラスをopenにする必要はなく、@Configurationや@Serviceのような特定のアノテーションが付与されたクラスのみで十分です。all-openプラグインを使用すると、そのようなアノテーションを指定できます。
Kotlinは、完全なIDE統合と共に、GradleとMavenの両方でall-openプラグインのサポートを提供します。
Springの場合、
kotlin-springコンパイラプラグインを使用できます。
Gradle
build.gradle(.kts)ファイルにプラグインを追加します。
plugins {
kotlin("plugin.allopen") version "2.2.21"
}plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "2.2.21"
}次に、クラスをopenにするアノテーションのリストを指定します。
allOpen {
annotation("com.my.Annotation")
// annotations("com.another.Annotation", "com.third.Annotation")
}allOpen {
annotation("com.my.Annotation")
// annotations("com.another.Annotation", "com.third.Annotation")
}クラス(またはそのいずれかのスーパークラス)にcom.my.Annotationが付与されている場合、クラス自体と全てのメンバーがopenになります。
これはメタアノテーションでも機能します。
@com.my.Annotation
annotation class MyFrameworkAnnotation
@MyFrameworkAnnotation
class MyClass // will be all-openMyFrameworkAnnotationにはall-openメタアノテーションcom.my.Annotationが付与されており、そのためそれ自体もall-openアノテーションになります。
Maven
pom.xmlファイルにプラグインを追加します。
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- Or "spring" for the Spring support -->
<plugin>all-open</plugin>
</compilerPlugins>
<pluginOptions>
<!-- Each annotation is placed on its own line -->
<option>all-open:annotation=com.my.Annotation</option>
<option>all-open:annotation=com.their.AnotherAnnotation</option>
</pluginOptions>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>all-openアノテーションがどのように機能するかについての詳細は、Gradleセクションを参照してください。
Springサポート
Springを使用している場合、Springアノテーションを手動で指定する代わりに、kotlin-springコンパイラプラグインを有効にできます。kotlin-springはall-openのラッパーであり、全く同じように動作します。
build.gradle(.kts)ファイルにspringプラグインを追加します。
plugins {
id("org.jetbrains.kotlin.plugin.spring") version "2.2.21"
}plugins {
id "org.jetbrains.kotlin.plugin.spring" version "2.2.21"
}Mavenでは、springプラグインはkotlin-maven-allopenプラグインの依存関係によって提供されます。そのため、pom.xmlファイルで有効にするには、以下のように記述します。
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>このプラグインは以下のAノテーションを指定します。
メタアノテーションのサポートにより、@Configuration、 @Controller、 @RestController、 @Service、 @Repository が付与されたクラスは、これらのアノテーションに@Componentがメタアノテーションとして付与されているため、自動的にopenになります。
もちろん、同じプロジェクトでkotlin-allopenとkotlin-springの両方を使用できます。
start.spring.ioサービスでプロジェクトテンプレートを生成する場合、
kotlin-springプラグインはデフォルトで有効になります。
コマンドラインコンパイラ
All-openコンパイラプラグインのJARは、Kotlinコンパイラのバイナリ配布版で利用可能です。-Xplugin kotlincオプションを使用してJARファイルへのパスを提供することで、プラグインをアタッチできます。
-Xplugin=$KOTLIN_HOME/lib/allopen-compiler-plugin.jarannotationプラグインオプションを使用してall-openアノテーションを直接指定するか、_プリセット_を有効にできます。
# プラグインオプションの形式は "-P plugin:<plugin id>:<key>=<value>" です。
# オプションは繰り返し指定できます。
-P plugin:org.jetbrains.kotlin.allopen:annotation=com.my.Annotation
-P plugin:org.jetbrains.kotlin.allopen:preset=springall-openプラグインで利用可能なプリセットは、spring、micronaut、quarkusです。
