Skip to content

Kotlin과 OSGi

Kotlin 프로젝트에서 Kotlin OSGi 지원을 활성화하려면, 일반 Kotlin 라이브러리 대신 kotlin-osgi-bundle을 포함하세요. kotlin-osgi-bundle에는 이 모든 것이 이미 포함되어 있으므로, kotlin-runtime, kotlin-stdlib, kotlin-reflect 종속성을 제거하는 것이 좋습니다. 또한 외부 Kotlin 라이브러리가 포함된 경우에도 주의를 기울여야 합니다. 대부분의 일반 Kotlin 종속성은 OSGi-ready가 아니므로, 이를 사용하지 말고 프로젝트에서 제거해야 합니다.

Maven

Maven 프로젝트에 Kotlin OSGi 번들을 포함하려면:

xml
<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-osgi-bundle</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>

외부 라이브러리에서 표준 라이브러리를 제외하려면 (참고: "별표 제외(*)"는 Maven 3에서만 작동합니다):

xml
<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

Gradle 프로젝트에 kotlin-osgi-bundle을 포함하려면:

kotlin
dependencies {
    implementation(kotlin("osgi-bundle"))
}
groovy
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-osgi-bundle:2.1.21"
}

전이적 종속성으로 제공되는 기본 Kotlin 라이브러리를 제외하려면 다음 접근 방식을 사용할 수 있습니다:

kotlin
dependencies {
    implementation("some.group.id:some.library:someversion") {
        exclude(group = "org.jetbrains.kotlin")
    }
}
groovy
dependencies {
    implementation('some.group.id:some.library:someversion') {
        exclude group: 'org.jetbrains.kotlin'
    }
}

FAQ

왜 모든 Kotlin 라이브러리에 필요한 매니페스트 옵션을 추가하지 않나요?

OSGi 지원을 제공하는 가장 선호되는 방식이긴 하지만, 아쉽게도 현재로서는 쉽게 제거할 수 없는 소위 "패키지 분할(package split) 문제" 때문에 불가능하며, 현재로서는 그러한 큰 변경이 계획되어 있지 않습니다. Require-Bundle 기능이 있지만, 이 역시 최선의 옵션이 아니며 사용이 권장되지 않습니다. 따라서 OSGi를 위한 별도의 아티팩트를 만들기로 결정했습니다.