Skip to content

All-openコンパイラプラグイン

Kotlin のクラスとそのメンバーはデフォルトでfinalであり、クラスがopenである必要がある Spring AOP のようなフレームワークやライブラリを使用する上で不便です。all-openコンパイラプラグインは、そのようなフレームワークの要件に Kotlin を適合させ、特定の アノテーション が付与されたクラスとそのメンバーを、明示的なopenキーワードなしでopenにします。

例えば、Spring を使用する場合、すべてのクラスをopenにする必要はなく、@Configuration@Serviceのような特定の アノテーション が付与されたクラスのみでよいです。all-openプラグインを使用すると、そのような アノテーション を指定できます。

Kotlin は、Gradle と Maven の両方でall-openプラグインのサポートを、完全なIDE統合とともに提供しています。

NOTE

Spring の場合、kotlin-springコンパイラプラグインを使用できます。

Gradle

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

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

次に、クラスを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になります。

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

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>
            <!-- 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.1.21"
}
groovy
plugins {
    id "org.jetbrains.kotlin.plugin.spring" version "2.1.21"
}

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>

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

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

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

NOTE

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

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

All-open コンパイラプラグインのJARは、Kotlin コンパイラのバイナリディストリビューションで利用できます。プラグインをアタッチするには、kotlinc-Xpluginオプションを使用して、その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です。