Kotlin и OSGi

Для включения поддержки Kotlin OSGi необходимо включить kotlin-osgi-bundle вместо обычных библиотек Kotlin. Рекомендуется удалить зависимости kotlin-runtime, kotlin-stdlib и kotlin-reflect, т.к. kotlin-osgi-bundle уже содержит их все. Следует обратить внимание на то, подключены ли внешние библиотеки Kotlin. Большинство обычных зависимостей Kotlin не готовы для использования с OSGi, поэтому их не следует использовать и нужно удалить из проекта.

Maven

Включим комплект Kotlin OSGi в проект Maven:

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

Исключим стандартную библиотеку из внешних библиотек (обратите внимание, что «звездное исключение» работает только в Maven 3):

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

compile "org.jetbrains.kotlin:kotlin-osgi-bundle:$kotlinVersion"

Чтобы исключить стандартные библиотеки Kotlin, входящие в состав транзитивных зависимостей, можно использовать следующий подход:

dependencies {
 compile (
   [group: 'some.group.id', name: 'some.library', version: 'someversion'],
   .....) {
  exclude group: 'org.jetbrains.kotlin'
}

Часто задаваемые вопросы

Почему бы просто не добавить необходимые параметры манифеста ко всем библиотекам Kotlin?

Несмотря на то, что это самый предпочтительный способ предоставить поддержку OSGi, к сожалению, на данный момент это невозможно сделать из-за так называемой проблемы “разделения пакета”, которая не может быть легко устранена, и такие большие изменения пока не планируются. Есть функция Require-Bundle, но она не является лучшим вариантом и не рекомендована к использованию. Поэтому было принято решение сделать отдельный артефакт для OSGi.