Skip to content

All-open 編譯器插件

Kotlin 中的類別及其成員預設為 final,這使得在使用諸如 Spring AOP 這類要求類別為 open 的框架與函式庫時很不方便。all-open 編譯器插件讓 Kotlin 適應這些框架的需求,使經由特定註解標註的類別及其成員無需明確的 open 關鍵字即可變得 open

例如,當您使用 Spring 時,並非所有類別都需要 open,而只需要那些經由特定註解(如 @Configuration@Service)標註的類別。all-open 插件允許您指定這類註解。

Kotlin 為 Gradle 和 Maven 都提供了 all-open 插件支援,並具備完整的 IDE 整合。

對於 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>
            <!-- 或者為 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,您可以啟用 kotlin-spring 編譯器插件,而無需手動指定 Spring 註解。kotlin-springall-open 之上的包裝器,其行為方式與 all-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>

此插件指定了以下註解:

由於支援元註解,經由 @Configuration@Controller@RestController@Service@Repository 標註的類別會自動 open,因為這些註解都經由 @Component 元註解標註。

當然,您可以在同一個專案中同時使用 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:<插件 ID>:<鍵>=<值>"。 
# 選項可以重複。

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

適用於 all-open 插件的預設組有:springmicronautquarkus