Skip to content

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)ファイルにプラグインを追加します。

kotlin
plugins {
    kotlin("plugin.allopen") version "2.3.0"
}
groovy
plugins {
    id "org.jetbrains.kotlin.plugin.allopen" version "2.3.0"
}

次に、クラスをオープンにするアノテーションのリストを指定します。

kotlin
allOpen {
    annotation("com.my.Annotation")
    // annotations("com.another.Annotation", "com.third.Annotation")
}
groovy
allOpen {
    annotation("com.my.Annotation")
    // annotations("com.another.Annotation", "com.third.Annotation")
}

クラス(またはそのスーパークラスのいずれか)にcom.my.Annotationが付与されている場合、そのクラス自体とすべてのメンバがオープンになります。

これはメタアノテーション(meta-annotation)でも動作します。

kotlin
@com.my.Annotation
annotation class MyFrameworkAnnotation

@MyFrameworkAnnotation
class MyClass // all-openになります

MyFrameworkAnnotationはall-openメタアノテーションであるcom.my.Annotationでアノテートされているため、これもall-openアノテーションになります。

Maven

pom.xmlファイルにプラグインを追加します。

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-springall-openの上に構築されたラッパー(wrapper)であり、全く同じように動作します。

build.gradle(.kts)ファイルにspringプラグインを追加します。

kotlin
plugins {
    id("org.jetbrains.kotlin.plugin.spring") version "2.3.0"
}
groovy
plugins {
    id "org.jetbrains.kotlin.plugin.spring" version "2.3.0"
}

Mavenでは、springプラグインはkotlin-maven-allopenプラグインの依存関係によって提供されます。pom.xmlファイルで有効にするには以下のように記述します。

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-allopenkotlin-springの両方を使用することも可能です。

start.spring.ioサービスでプロジェクトテンプレートを生成した場合、kotlin-springプラグインはデフォルトで有効になります。

コマンドラインコンパイラ

All-openコンパイラプラグインのJARは、Kotlinコンパイラのバイナリ配布物に含まれています。kotlinc-Xpluginオプションを使用して、JARファイルへのパスを指定することでプラグインを適用できます。

bash
-Xplugin=$KOTLIN_HOME/lib/allopen-compiler-plugin.jar

annotationプラグインオプションを使用してall-openアノテーションを直接指定するか、プリセット (preset) を有効にできます。

bash
# プラグインオプションの形式: "-P plugin:<plugin id>:<key>=<value>"
# オプションは繰り返して指定可能です。

-P plugin:org.jetbrains.kotlin.allopen:annotation=com.my.Annotation
-P plugin:org.jetbrains.kotlin.allopen:preset=spring

all-openプラグインで利用可能なプリセットは、springmicronaut、およびquarkusです。