Skip to content

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

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

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

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が付与されている場合、クラス自体と全てのメンバーがopenになります。

これはメタアノテーションでも機能します。

kotlin
@com.my.Annotation
annotation class MyFrameworkAnnotation

@MyFrameworkAnnotation
class MyClass // will be 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>
            <!-- 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-springall-openのラッパーであり、全く同じように動作します。

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

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

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>

このプラグインは以下のAノテーションを指定します。

メタアノテーションのサポートにより、@Configuration@Controller@RestController@Service@Repository が付与されたクラスは、これらのアノテーションに@Componentがメタアノテーションとして付与されているため、自動的にopenになります。

もちろん、同じプロジェクトでkotlin-allopenkotlin-springの両方を使用できます。

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

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

All-openコンパイラプラグインのJARは、Kotlinコンパイラのバイナリ配布版で利用可能です。-Xplugin kotlincオプションを使用してJARファイルへのパスを提供することで、プラグインをアタッチできます。

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

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

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プラグインで利用可能なプリセットは、springmicronautquarkusです。