6.7.6 Kotlin 与 OSGi

原文链接: https://kotlinlang.org/docs/kotlin-osgi.html

6.7.6 Kotlin 与 OSGi

要在你的 Kotlin 项目中启用 Kotlin 的 OSGi 支持,请引入 kotlin-osgi-bundle 而不是常规的 Kotlin 库。建议移除 kotlin-runtime、kotlin-stdlib 和 kotlin-reflect 依赖,因为 kotlin-osgi-bundle 已经包含了它们。在包含外部 Kotlin 库时你也应当注意。大多数常规 Kotlin 依赖并非 OSGi 就绪,因此不应使用它们,并应把它们从项目中移除。

Maven

要把 Kotlin OSGi bundle 引入 Maven 项目:

1
2
3
4
5
6
7
<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-osgi-bundle</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>

要把标准库从外部库中排除(注意"星号排除"只在 Maven 3 中有效):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<dependency>
    <groupId>some.group.id</groupId>
    <artifactId>some.library</artifactId>
    <version>some.library.version</version>

    <exclusions>
        <exclusion>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Gradle

要把 kotlin-osgi-bundle 引入 Gradle 项目:

Kotlin

1
2
3
dependencies {
    implementation(kotlin("osgi-bundle"))
}

Groovy

1
2
3
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-osgi-bundle:2.4.20"
}

要排除作为传递依赖引入的默认 Kotlin 库,可以使用以下方式:

Kotlin

1
2
3
4
5
dependencies {
    implementation("some.group.id:some.library:someversion") {
        exclude(group = "org.jetbrains.kotlin")
    }
}

Groovy

1
2
3
4
5
dependencies {
    implementation('some.group.id:some.library:someversion') {
        exclude group: 'org.jetbrains.kotlin'
    }
}

常见问题

为什么不直接给所有 Kotlin 库添加所需的 manifest 选项

尽管这是提供 OSGi 支持最可取的方式,但遗憾的是目前无法这样做,原因是所谓的“包拆分"问题难以简单消除,而如此大的改动目前也不在计划之列。虽然有 Require-Bundle 特性,但它也不是最佳选择,并且不建议使用。因此决定为 OSGi 单独制作一个构件。