All-openコンパイラプラグイン
Kotlinではクラスとそのメンバはデフォルトでfinalです。そのため、クラスをopenにする必要があるSpring AOPなどのフレームワークやライブラリを使用する際に不便です。all-openコンパイラプラグインは、Kotlinをこれらのフレームワークの要件に適応させ、特定のアノテーションが付与されたクラスとそのメンバを、明示的なopenキーワードなしでオープン(open)にします。
例えば、Springを使用する場合、すべてのクラスをオープンにする必要はなく、@Configurationや@Serviceのような特定のアノテーションが付与されたクラスのみを対象としたい場合があります。all-openプラグインでは、そのようなアノテーションを指定できます。
Kotlinは、GradleとMavenの両方で、完全なIDE統合を備えたall-openプラグインのサポートを提供しています。
Springの場合は、
kotlin-springコンパイラプラグインを使用できます。
Gradle
build.gradle(.kts)ファイルにプラグインを追加します。
plugins {
kotlin("plugin.allopen") version "2.3.0"
}plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "2.3.0"
}次に、クラスをオープンにするアノテーションのリストを指定します。
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が付与されている場合、そのクラス自体とすべてのメンバがオープンになります。
これはメタアノテーション(meta-annotation)でも動作します。
@com.my.Annotation
annotation class MyFrameworkAnnotation
@MyFrameworkAnnotation
class MyClass // all-openになりますMyFrameworkAnnotationは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>
<!-- Springサポートの場合は "spring" を指定 -->
<plugin>all-open</plugin>
</compilerPlugins>
<pluginOptions>
<!-- 各アノテーションを個別の行に配置します -->
<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の上に構築されたラッパー(wrapper)であり、全く同じように動作します。
build.gradle(.kts)ファイルにspringプラグインを追加します。
plugins {
id("org.jetbrains.kotlin.plugin.spring") version "2.3.0"
}plugins {
id "org.jetbrains.kotlin.plugin.spring" version "2.3.0"
}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>このプラグインは以下のアノテーションを指定します:
メタアノテーションのサポートにより、@Configuration、@Controller、@RestController、@Service、@Repositoryが付与されたクラスは、これらのアノテーションが@Componentでメタアノテートされているため、自動的にオープンになります。
もちろん、同じプロジェクト内でkotlin-allopenとkotlin-springの両方を使用することも可能です。
start.spring.ioサービスでプロジェクトテンプレートを生成した場合、
kotlin-springプラグインはデフォルトで有効になります。
コマンドラインコンパイラ
All-openコンパイラプラグインのJARは、Kotlinコンパイラのバイナリ配布物に含まれています。kotlincの-Xpluginオプションを使用して、JARファイルへのパスを指定することでプラグインを適用できます。
-Xplugin=$KOTLIN_HOME/lib/allopen-compiler-plugin.jarannotationプラグインオプションを使用してall-openアノテーションを直接指定するか、プリセット (preset) を有効にできます。
# プラグインオプションの形式: "-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です。
