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.